oracle sql調優

dragon路發表於2011-05-12

Oracle SQL調優

oracle sql調優 (2010-11-10 17:08:43)

Oracle SQL調優除此之外還有以下幾方面的注意點:
1. 選擇最有效率的表名順序
由於ORACLE解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理。
當ORACLE處理多個表時, 會運用排序及合併的方式連線它們.首先,掃描第一個表(FROM子句中最後的那個表)並對記錄進行排序,然後掃描第二個表(FROM子句中最後第二個表),最後將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合併。
EXP:
表 TAB1 16,384 條記錄
表 TAB2 1      條記錄
選擇TAB2作為基礎表 (最好的方法)
select count(*) from tab1,tab2   執行時間0.96秒
select count(*) from tab2,tab1   執行時間26.09秒

2. WHERE子句中的連線順序
由於ORACLE解析器按照從右到左的順序處理,所以那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。
EXP:
(低效,執行時間156.3秒)
SELECT … FROM EMP E
WHERE  SAL >50000
AND    JOB = ‘MANAGER’
AND    25 < (SELECT COUNT(*) FROM EMP);
WHERE MGR=E.EMPNO)

(高效,執行時間10.6秒)
SELECT … FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)
AND    SAL >50000
AND    JOB = ‘MANAGER’

3. 減少訪問資料庫的次數
當執行每條SQL語句時, ORACLE在內部執行了許多工作:
解析SQL語句,估算索引的利用率,繫結變數, 讀資料塊等等. 由此可見, 減少訪問資料庫的次數 , 就能實際上減少ORACLE的工作量。

4. 高效的刪除重複記錄
最高效的刪除重複記錄方法 ( 因為使用了ROWID)
EXP:
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);

5. 用TRUNCATE替代DELETE
Truncate–DDL
Delete—-DML

6. 儘量多使用COMMIT
COMMIT所釋放的資源:
A、回滾段上用於恢復資料的資訊.
B、被程式語句獲得的鎖
C、redo log buffer 中的空間
D、ORACLE為管理上述3種資源中的內部花費
NOTE: 在使用COMMIT時必須要注意到事務的完整性,現實中效率和事務完整性往往是魚和熊掌不可得兼。

7. 用Where子句替換HAVING子句
避免使用HAVING子句,HAVING 只會在檢索出所有記錄之後才對結果集進行過濾,這個處理需要排序、總計等操作。
WHERE子句限制記錄的數目,能減少這方面的開銷。

8. 避免在索引列上使用NOT
使用NOT, 會停止使用索引轉而執行全表掃描.
EXP:
低效: (這裡,不使用索引)
SELECT …   FROM DEPT  WHERE NOT DEPT_CODE = 0;
高效: (這裡,使用了索引)
SELECT …  FROM DEPT  WHERE DEPT_CODE > 0;
需要注意的是,在某些時候,ORACLE優化器會自動將NOT轉化成相對應的關係操作符.
NOT >  to  <=
NOT >= to  <
NOT =
NOT <= to  >
衍生出去的另一個調優及為用>=替代>。兩者的區別在於, 前者DBMS將直接跳到第一個DEPT等於4的記錄而後者將首先定位到DEPTNO=3的記錄並且向前掃描到第一個DEPT大於3的記錄。

Jason之後會介紹如何利用ORACLE相關的工具進行調優,調優無止境,方法才是硬道理 oracle sql調優
———EOF———

作者: 吳穎敏 | www.futurehandw.com
Email: wuyingminhui@gmail.com 
轉載請註明來源:吳穎敏 - www.futurehandw.com

相關文章