快捷搜索:

Oracle语句优化规则汇总(4)(1) - Oracle

1. 应用表的又名(Alias)

当在SQL语句中连接多个表时, 请应用表的又名并把又名前缀于每个Column上。这样一来,就可以削减解析的光阴并削减那些由Column歧义引起的语法差错。

(Column歧义指的是因为SQL中不合的表具有相同的Column名,当SQL语句中呈现这个Column时,SQL解析器无法判断这个Column的归属)

2. 用EXISTS替代IN

在许多基于根基表的查询中,为了满意一个前提,每每必要对另一个表进行联接。在这种环境下, 应用EXISTS(或NOT EXISTS)平日将前进查询的效率。

低效:

SELECT*

FROMEMP(根基表)

WHEREEMPNO>0

ANDDEPTNOIN(SELECTDEPTNO

FROMDEPT

WHERELOC=‘MELB’)

高效:

SELECT*

FROMEMP(根基表)

WHEREEMPNO>0

ANDEXISTS(SELECT‘X’

FROMDEPT

WHEREDEPT.DEPTNO=EMP.DEPTNO

ANDLOC=‘MELB’)

(相对来说,用NOT EXISTS调换NOT IN 将更显明地前进效率,下面将指出)

3. 用NOT EXISTS替代NOT IN

在子查询中,NOT IN子句将履行一个内部的排序和合并。 无论在哪种环境下,NOT IN都是最低效的 (由于它对子查询中的表履行了一个全表遍历)。 为了避免应用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

例如:

SELECT…

FROMEMP

WHEREDEPT_NONOTIN(SELECTDEPT_NO

FROMDEPT

WHEREDEPT_CAT=’A’);

为了前进效率。改写为:

(措施一: 高效)

SELECT….

FROMEMPA,DEPTB

WHEREA.DEPT_NO=B.DEPT(+)

ANDB.DEPT_NOISNULL

ANDB.DEPT_CAT(+)=‘A’

(措施二: 最高效)

SELECT….

FROMEMPE

WHERENOTEXISTS(SELECT‘X’

FROMDEPTD

WHERED.DEPT_NO=E.DEPT_NO

ANDDEPT_CAT=‘A’);

4. 用表连接调换EXISTS

平日来说 , 采纳表连接的要领比EXISTS更有效率

SELECTENAME

FROMEMPE

WHEREEXISTS(SELECT‘X’

FROMDEPT

WHEREDEPT_NO=E.DEPT_NO

ANDDEPT_CAT=‘A’);

(更高效)

SELECTENAME

FROMDEPTD,EMPE

WHEREE.DEPT_NO=D.DEPT_NO

ANDDEPT_CAT=‘A’;

(在RBO的环境下,前者的履行路径包括FILTER,后者应用NESTED LOOP)

5. 用EXISTS调换DISTINCT

当提交一个包孕一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中应用DISTINCT. 一样平常可以斟酌用EXIST调换

例如:

低效:

SELECTDISTINCTDEPT_NO,DEPT_NAME

FROMDEPTD,EMPE

WHERED.DEPT_NO=E.DEPT_NO

高效:

SELECTDEPT_NO,DEPT_NAME

FROMDEPTD

WHEREEXISTS(SELECT‘X’

FROMEMPE

WHEREE.DEPT_NO=D.DEPT_NO);

EXISTS 使查询更为迅速,由于RDBMS核心模块将在子查询的前提一旦满意后,立即返回结果。

6. 识别‘低效履行’的SQL语句

用下列SQL对象找出低效SQL:

SELECTEXECUTIONS,DISK_READS,BUFFER_GETS,

ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2)Hit_radio,

ROUND(DISK_READS/EXECUTIONS,2)Reads_per_run,

SQL_TEXT

FROMV$SQLAREA

WHEREEXECUTIONS>0

ANDBUFFER_GETS>0

AND(BUFFER_GETS-DISK_READS)/BUFFER_GETS

(虽然今朝各类关于SQL优化的图形化对象层出不穷,然则写出自己的SQL对象来办理问题始终是一个最好的措施)

7. 应用TKPROF 对象来查询SQL机能状态

SQL trace 对象网络正在履行的SQL的机能状态数据并记录到一个跟踪文件中。 这个跟踪文件供给了许多有用的信息,例如解析次数。履行次数,CPU应用光阴等。这些数据将可以用来优化你的系统。

设置SQL TRACE在会话级别:

有效

ALTERSESSIONSETSQL_TRACETRUE

设置SQL TRACE 在全部数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数阐清楚明了天生跟踪文件的目录

(这里并没有提到TKPROF的用法, 对SQL TRACE的用法也不敷准确, 设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS, 这样才能获得那些紧张的光阴状态。 天生的trace文件是弗成读的,以是要用TKPROF对象对其进行转换,TKPROF有许多履行参数。 大年夜家可以参考ORACLE手册来懂得详细的设置设置设备摆设摆设。 )

您可能还会对下面的文章感兴趣: