`

Oracle性能调整与优化(二)

阅读更多

为了能取得圆满成功,我将涉及到一些预备步骤,它们将在查看发生了什么时需要,这些步骤包括运行plustrce SQL脚本、创建一个“EXPLAIN_PLAN”表、授予角色、配置sql*plus环境查看执行计划。所有这些步骤都包括在“Oracle 9i R2数据库性能调整指南和参考”中“在sql*plus中使用自动跟踪”,对于Oracle 10g,这些步骤包括在“sql*plus用户指南和参考10.2版”中“调整sql*plus”。

预备步骤

如果角色PLUSTRACE不存在,用ORACLE_HOME\sqlplus\admin目录下的PLUSTRCE SQL脚本来创建它,这个脚本相当简单:

drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$mystat to plustrace;
grant plustrace to dba with admin option;

检查角色使用情况:

SQL> select role from dba_roles where role = 'PLUSTRACE';
ROLE
----------------
PLUSTRACE

用户必须有(或有权限访问)一个PLAN_TABLE(它可以被命名为其他名字,但是默认的名字非常好),这个表是用ORACLE_HOME\rdbms\admin目录下的UTLXPLAN SQL脚本创建的。

SQL> show user
USER is "SYSTEM"
SQL> @?\rdbms\admin\utlxplan
Table created. 
SQL> create public synonym plan_table for system.plan_table;
Synonym created.
SQL> grant select, update, insert, delete on plan_table to <你的用户名>;
Grant succeeded.
SQL> grant plustrace to <你的用户名>;
Grant succeeded.

我们的例子中使用的用户是HR(可以在Oracle提供的样本方案中找到)。

SQL> conn hr/hr
Connected.
SQL> set autotrace on
SQL> select * from dual;
D
-
X

因为autotrace被设置为on,你将能够看到执行计划和一些统计信息,你看到的输出应该与下面的内容类似:

Execution Plan
----------------------------------------------------------
0  SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=2)
1  0 TABLE ACCESS (FULL) OF 'DUAL' (TABLE) (Cost=2 Card=1 Bytes=2)
Statistics
----------------------------------------------------------
24  recursive calls
0  db block gets
6  consistent gets
1  physical reads
0  redo size
389  bytes sent via SQL*Net to client
508  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed

要取消查询结果,在set语句中使用“traceonly”。

使用绑定变量

在任何DBA帮助类型的网站上,常常会看到一点使用绑定变量的建议,但是步骤或包括在这些步骤中的指令很少,这里有一个创建和使用绑定变量的简单方法。

SQL> variable department_id number
SQL> begin
2  :department_id := 80;
3  end;
4  /
PL/SQL procedure successfully completed.
SQL> print department_id
DEPARTMENT_ID
-------------
80

 

ok!区别不是太大(cost从3变为2),但这是一个小例子(表只有107行),当工作在一个更大的表上会有更多区别吗?使用SH方案,它的SALES表有超过900,000行数据。

SQL> select prod_id, count(prod_id)
2  from sales
3  where prod_id > 130
4  group by prod_id;

同样的查询,但这次使用一个绑定变量:

SQL> variable prod_id number
SQL> begin
2  :prod_id := 130;
3  end;
4  /
PL/SQL procedure successfully completed.
SQL> print prod_id
PROD_ID
----------
130
SQL> select prod_id, count(prod_id)
2  from sales
3  where prod_id > :prod_id
4  group by prod_id;

cost从540变为33了,这一下就显得十分明显了,其中最主要的受益是使用绑定变量的查询,你要做的就是为这个变量替换一个新值。

使用效率高的SQL

假设你在下面的两个查询中做一个选择(再次使用HR方案):

查询1

select d.department_id, 
d.department_name, 
r.region_name
from departments d, 
locations l, 
countries c, regions r
where d.location_id=l.location_id
and l.country_id=c.country_id
and c.region_id=r.region_id;

select department_id, 
department_name, 
region_name
from departments natural join locations
natural join countries natural join regions;

这产生了四个问题。

1、这些查询的查询结果集一致吗?

2、如果它们是一致的,你能预计在它们的执行计划中有什么不同吗?

3、如果这些执行计划一致,是什么使得这些查询不同?

4、能做些什么事情来改善成本(cost)?

第一个问题的答案是“是”,它们的查询结果集是一致的;第二个问题的答案是“不能”,因为相同的步骤是连接表;第三个问题的答案需要处理输入的数量或涉及的编码。

在这个例子中关键词“自然连接(natural join)”,“join on”,“左/右 外连接(right/left outer join)”的使用是怎么回事,如果你懂得什么是自然连接(仍然连接两个表,但是涉及到的列名是相同的),看起来使用第二个查询不是更容易了吗?

至于最后一个问题的答案,效率高的SQL对不同的人可能意思不一样,在本例中,使用一个视图怎么样?这样与最初的查询在成本上有何不同,或有其他需要考虑的事情吗?

假设我有一个名叫cost_example的视图,创建语句如下:

create or replace view cost_example
as
select department_id, department_name, region_name
from departments natural join locations
natural join countries natural join regions;

让我们在视图中查看一条记录

SQL> select department_id, department_name, region_name
2  from cost_example
3  where department_id=70;
DEPARTMENT_ID DEPARTMENT_NAME                REGION_NAME
------------- ------------------------------ ------------
70 Public Relations               Europe

输出三列或字段,它们能够被改动吗?如果可以,为什么?如果不可以,为什么不可以?

我们假设现在用Asia代替REGION_NAME的值Europe

SQL> update cost_example
2  set region_name = 'Asia'
3  where region_name = 'Europe';
set region_name = 'Asia'
*
ERROR at line 2:
ORA-01779: cannot modify a column which maps to a non key-preserved table

DEPARTMENT_NAME字段的值能被修改吗?

SQL> update cost_example
2  set department_name = 'PR'
3  where department_name = 'Public Relations';
1  row updated.

为什么在视图中的记录能被更新的原因是departments表是一个关键保护表(它的主键DEPARTMENT_ID用于视图的创建了)。

这个例子的要点是:仅仅因为你获得了低成本并不意味着你就不能再为查询优化做其他的事情了,使用单一连接结构适用于开发者,视图适用于用户。

小结

本文的主要观点是:

·使用绑定变量

·使用效率高的SQL

·使用编码标准

·创建适当的视图

这些步骤没有哪个在执行或实现起来特别困难,因为程序员常常使用"tableA.column_name = tableB.column_name"的格式来连接,转移到使用自然连接节约相当多的输入,加上受益于关键列名相配(在子表中的外键列与父表中的主键有相同的列名),如展示的那样,某些量度可能没有大的影响,但是当当作为一个整体时,每一个小的都对改善性能有帮助,在第3部分中,我们将查看更多的例子。

分享到:
评论

相关推荐

    Oracle Database 性能调整与优化 系列书.rar

    "Oracle Database 11gR2性能调整与优化"与"Oracle Database 12cR2性能调整与优化"这两本书分别针对Oracle的不同版本,提供了深入的性能优化策略和技巧。 Oracle Database 11gR2性能调整主要涉及以下几个方面: 1. ...

    oracle数据库性能优化.pdf

    除了上述两点,Oracle性能优化还包括索引的建立与管理,分区策略的运用,回滚段的优化,以及查询执行计划的控制等。索引能加速数据检索,但过度的索引会增加写操作的开销,需权衡利弊。分区策略可将大表分解,提高...

    Oracle性能优化绝版好书:高级OWI与ORACLE性能调整

    《Oracle性能优化绝版好书:高级OWI与ORACLE性能调整》这本书深入探讨了Oracle数据库性能优化的关键技术和策略,特别关注了Oracle Wait Interface (OWI)和性能调整的实践应用。OWI是Oracle数据库中用于监控和诊断...

    Oracle Database 11gR2性能调整与优化

    Oracle Database 11gR2性能调整与优化

    高级owi与oracle性能调整.pdf

    根据提供的信息,我们可以推断出这本名为“高级owi与oracle性能调整”的书籍主要讨论了高级owi技术以及Oracle数据库性能优化的相关内容。由于提供的部分页面信息仅包含联系方式,并没有具体的章节内容,因此以下将...

    Oracle性能调优.pdf

    Oracle性能调优 Oracle性能调优 Oracle性能调优 Oracle性能调优 Oracle性能调优 Oracle性能调优 Oracle性能调优

    Oracle 12C OCM 性能优化考试教材.zip

    这个压缩包包含了与Oracle 12C OCM性能优化考试相关的教材,帮助考生深入理解和掌握相关技术。下面将详细阐述其中的知识点。 一、Oracle 12C的新特性 1. 多租户架构(Multitenant Architecture):Oracle 12C引入...

    《Oracle Database 11gR2性能调整与优化》PDF版本下载.txt

    《Oracle Database 11gR2性能调整与优化》PDF版本下载

    Oracle Database 11g R2性能调整与优化

    在性能调整与优化方面,Oracle 11g R2提供了许多工具和技术,以帮助管理员和开发人员实现最佳的系统性能。 首先,Oracle的自动工作负载 repository (AWR) 是一个强大的性能监控工具。AWR收集关于数据库性能的数据,...

    Oracle的性能调试与优化

    ### Oracle的性能调试与优化 #### 一、概述 《Oracle的性能调试与优化》这本书由Springer出版社出版,共510页,出版日期为2002年12月13日,ISBN编号为0387953930。该书主要针对数据库应用程序中的常见问题,即精心...

    oracle9i 性能调整与优化

    就是那本大名鼎鼎的《oracle9i性能调整与优化》,Richard.J.Niemiec著,清华大学出出版。一共4个包

    Oracle性能优化与故障诊断案例分享

    Oracle数据库性能优化与故障诊断是数据库管理中极为重要的两个方面,它们直接关系到企业业务系统的稳定运行和性能表现。在这篇文章中,我们将详细探讨针对Oracle数据库性能问题和故障的诊断案例,并分享如何通过案例...

    oracle性能优化与调整

    Oracle数据库性能优化与调整是一个复杂而关键的任务,它涉及到数据库自身、硬件、操作系统等多个层面的协同工作。Oracle作为全球领先的关系型数据库管理系统,其性能优化的重要性不言而喻,尤其在处理大规模网络应用...

    Oracle的性能调整与优化分析.pdf

    Oracle性能调整与优化分析 Oracle数据库是大型的关系型数据库,目前广泛应用于电信、金融、政府、交通、能源等各大部门和企业,成为基于大数据访问的重要数据库平台。然而,随着Oracle数据库应用的普及,数据库...

    oracle 性能调整 sql性能优化大全

    Oracle数据库性能调整与SQL性能优化是数据库管理员和开发人员日常工作中不可或缺的部分。Oracle数据库系统以其高效、稳定和可扩展性闻名,但同时也需要通过精心的调整和优化来确保最佳性能。以下是一些关键的知识点...

    高级owi与oracle性能调整

    根据提供的标题“高级owi与oracle性能调整”及描述“高级owi与oracle性能调整”,我们可以推断出这份文档主要探讨的是如何通过高级优化方法提升Oracle数据库的性能。虽然提供的具体内容并没有实质性的技术信息,但...

Global site tag (gtag.js) - Google Analytics