数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle语句优化30个规则详解(8)


发布日期:2022年11月09日
 
Oracle语句优化30个规则详解

用EXISTS替换DISTINCT

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时避免在SELECT子句中使用DISTINCT 一般可以考虑用EXIST替换

例如

低效

SELECTDISTINCTDEPT_NODEPT_NAME

FROMDEPTDEMPE

WHEREDDEPT_NO=EDEPT_NO

高效

SELECTDEPT_NODEPT_NAME

FROMDEPTD

WHEREEXISTS(SELECTX

FROMEMPE

WHEREEDEPT_NO=DDEPT_NO);

EXISTS 使查询更为迅速因为RDBMS核心模块将在子查询的条件一旦满足后立刻返回结果

识别低效执行的SQL语句

用下列SQL工具找出低效SQL

SELECTEXECUTIONSDISK_READSBUFFER_GETS

ROUND((BUFFER_GETSDISK_READS)/BUFFER_GETS)Hit_radio

ROUND(DISK_READS/EXECUTIONS)Reads_per_run

SQL_TEXT

FROMV$SQLAREA

WHEREEXECUTIONS>

ANDBUFFER_GETS>

AND(BUFFER_GETSDISK_READS)/BUFFER_GETS<

ORDERBYDESC;

(译者按 虽然目前各种关于SQL优化的图形化工具层出不穷但是写出自己的SQL工具来解决问题始终是一个最好的方法)

使用TKPROF 工具来查询SQL性能状态

SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟蹤文件中 这个跟蹤文件提供了许多有用的信息例如解析次数执行次数CPU使用时间等这些数据将可以用来优化你的系统

设置SQL TRACE在会话级别

有效

ALTER SESSION SET SQL_TRACE TRUE

设置SQL TRACE 在整个数据库有效仿 你必须将SQL_TRACE参数在initora中设为TRUE USER_DUMP_DEST参数说明了生成跟蹤文件的目录

(译者按 这一节中作者并没有提到TKPROF的用法 对SQL TRACE的用法也不够准确 设置SQL TRACE首先要在initora中设定TIMED_STATISTICS 这样才能得到那些重要的时间状态生成的trace文件是不可读的所以要用TKPROF工具对其进行转换TKPROF有许多执行参数大家可以参考ORACLE手册来了解具体的配置 )

用EXPLAIN PLAN 分析SQL语句

EXPLAIN PLAN 是一个很好的分析SQL语句的工具它甚至可以在不执行SQL的情况下分析语句 通过分析我们就可以知道ORACLE是怎么样连接表使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称

你需要按照从里到外从上到下的次序解读分析的结果 EXPLAIN PLAN分析的结果是用缩进的格式排列的 最内部的操作将被最先解读 如果两个操作处于同一层中带有最小操作号的将被首先执行

NESTED LOOP是少数不按照上述规则处理的操作 正确的执行路径是检查对NESTED LOOP提供数据的操作其中操作号最小的将被最先处理

译者按通过实践 感到还是用SQLPLUS中的SET TRACE 功能比较方便

举例

SQL>list

SELECT*

FROMdeptemp

*WHEREempdeptno=deptdeptno

SQL>setautotracetraceonly/*traceonly可以不显示执行结果*/

SQL>/

rowsselected

ExecutionPlan

SELECTSTATEMENTptimizer=CHOOSE

NESTEDLOOPS

TABLEACCESS(FULL)OFEMP

TABLEACCESS(BYINDEXROWID)OFDEPT

INDEX(UNIQUESCAN)OFPK_DEPT(UNIQUE)

Statistics

recursivecalls

dbblockgets

consistentgets

physicalreads

redosize

bytessentviaSQL*Nettoclient

bytesreceivedviaSQL*Netfromclient

SQL*Netroundtripsto/fromclient

sorts(memory)

sorts(disk)

rowsprocessed

通过以上分析可以得出实际的执行步骤是

TABLEACCESS(FULL)OFEMP

INDEX(UNIQUESCAN)OFPK_DEPT(UNIQUE)

TABLEACCESS(BYINDEXROWID)OFDEPT

NESTEDLOOPS(JOININGAND)

目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具也许喜欢图形化界面的朋友们可以选用它们

上一篇:配置OracleEnterpriseManager过程总结

下一篇:Oracle 10g学习手册2:安装与构建三(图)