ORACLESQL性能優(yōu)化系列(六)

字號:

20. 用表連接替換EXISTS
     通常來說 , 采用表連接的方式比EXISTS更有效率
     SELECT ENAME
     FROM EMP E
     WHERE EXISTS (SELECT ‘X’
     FROM DEPT
     WHERE DEPT_NO = E.DEPT_NO
     AND DEPT_CAT = ‘A’);
     (更高效)
     SELECT ENAME
     FROM DEPT D,EMP E
     WHERE E.DEPT_NO = D.DEPT_NO
     AND DEPT_CAT = ‘A’ ;
    (譯者按: 在RBO的情況下,前者的執(zhí)行路徑包括FILTER,后者使用NESTED LOOP)
    21. 用EXISTS替換DISTINCT
    當(dāng)提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換
    例如:
    低效:
     SELECT DISTINCT DEPT_NO,DEPT_NAME
     FROM DEPT D,EMP E
     WHERE D.DEPT_NO = E.DEPT_NO
    高效:
     SELECT DEPT_NO,DEPT_NAME
     FROM DEPT D
     WHERE EXISTS ( SELECT ‘X’
     FROM EMP E
     WHERE E.DEPT_NO = D.DEPT_NO);
     EXISTS 使查詢更為迅速,因?yàn)镽DBMS核心模塊將在子查詢的條件一旦滿足后,立刻返回結(jié)果.
    22. 識別’低效執(zhí)行’的SQL語句
    用下列SQL工具找出低效SQL:
    SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
     ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
     ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
     SQL_TEXT
    FROM V$SQLAREA
    WHERE EXECUTIONS>0
    AND BUFFER_GETS > 0
    AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
    ORDER BY 4 DESC;
    (譯者按: 雖然目前各種關(guān)于SQL優(yōu)化的圖形化工具層出不窮,但是寫出自己的SQL工具來解決問題始終是一個的方法)
    23. 使用TKPROF 工具來查詢SQL性能狀態(tài)
    SQL trace 工具收集正在執(zhí)行的SQL的性能狀態(tài)數(shù)據(jù)并記錄到一個跟蹤文件中. 這個跟蹤文件提供了許多有用的信息,例如解析次數(shù).執(zhí)行次數(shù),CPU使用時間等.這些數(shù)據(jù)將可以用來優(yōu)化你的系統(tǒng).
    設(shè)置SQL TRACE在會話級別: 有效
     ALTER SESSION SET SQL_TRACE TRUE
    設(shè)置SQL TRACE 在整個數(shù)據(jù)庫有效仿, 你必須將SQL_TRACE參數(shù)在init.ora中設(shè)為TRUE, USER_DUMP_DEST參數(shù)說明了生成跟蹤文件的目錄
    (譯者按: 這一節(jié)中,作者并沒有提到TKPROF的用法, 對SQL TRACE的用法也不夠準(zhǔn)確, 設(shè)置SQL TRACE首先要在init.ora中設(shè)定TIMED_STATISTICS, 這樣才能得到那些重要的時間狀態(tài). 生成的trace文件是不可讀的,所以要用TKPROF工具對其進(jìn)行轉(zhuǎn)換,TKPROF有許多執(zhí)行參數(shù). 大家可以參考ORACLE手冊來了解具體的配置. )