ORACLE SQL效能最佳化系列 (十四) 完結篇 (轉)
46. 連線多個掃描:namespace prefix = o ns = "urn:schemas--com::office" />
如果你對一個列和一組有限的值進行比較, 器可能多次掃描並對結果進行合併連線.
舉例:
*
FROM LODGING
WHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’);
最佳化器可能將它轉換成以下形式
SELECT *
FROM LODGING
WHERE MANAGER = ‘BILL GATES’
OR MANAGER = ’KEN MULLER’;
當選擇執行路徑時, 最佳化器可能對每個條件採用LODGING$MANAGER上的範圍掃描. 返回的ROWID用來訪問LODGING表的記錄 (透過TABLE ACCESS BY ROWID 的方式). 最後兩組記錄以連線(CONCATENATION)的形式被組合成一個單一的集合.
Explain Plan :
SELECT STATEMENT Optimizer=CHOOSE
CONCATENATION
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
譯者按:
本節和第37節似乎有矛盾之處.
47. CBO下使用更具選擇性的索引
基於成本的最佳化器(CBO, Cost-Based Optimizer)對索引的選擇性進行判斷來決定索引的使用是否能提高.
如果索引有很高的選擇性, 那就是說對於每個不重複的索引鍵值,只對應數量很少的記錄.
比如, 表中共有100條記錄而其中有80個不重複的索引鍵值. 這個索引的選擇性就是80/100 = 0.8 . 選擇性越高, 透過索引鍵值檢索出的記錄就越少.
如果索引的選擇性很低, 檢索資料就需要大量的索引範圍查詢操作和ROWID 訪問表的
操作. 也許會比全表掃描的效率更低.
譯者按:
下列請參閱:
a. 如果檢索資料量超過30%的表中記錄數.使用索引將沒有顯著的效率提高.
b. 在特定情況下, 使用索引也許會比全表掃描慢, 但這是同一個數量級上的
區別. 而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
48. 避免使用耗費資源的操作
帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的語句會啟動SQL引擎
執行耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序.
例如,一個UNION查詢,其中每個查詢都帶有GROUP BY子句, GROUP BY會觸發嵌入排序(NESTED SORT) ; 這樣, 每個查詢需要執行一次排序, 然後在執行UNION時, 又一個唯一排序(SORT UNIQUE)操作被執行而且它只能在前面的嵌入排序結束後才能開始執行. 嵌入的排序的深度會大大影響查詢的效率.
通常, 帶有UNION, MINUS , INTERSECT的SQL語句都可以用其他方式重寫.
譯者按:
如果你的的SORT_AREA_SIZE調配得好, 使用UNION , MINUS, INTERSECT也是可以考慮的, 畢竟它們的可讀性很強
49. 最佳化GROUP BY
提高GROUP BY 語句的效率, 可以透過將不需要的記錄在GROUP BY 之前過濾掉.下面兩個查詢返回相同結果但第二個明顯就快了許多.
低效:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP JOB
HAVING JOB = ‘PRESNT’
OR JOB = ‘MANAGER’
高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT’
OR JOB = ‘MANAGER’
GROUP JOB
譯者按:
本節和14節相同. 可略過.
50. 使用日期
當使用日期是,需要注意如果有超過5位小數加到日期上, 這個日期會進到下一天!
例如:
1.
SELECT TO_DATE(‘01-JAN-93’+.99999)
FROM DUAL;
Returns:
’
2.
SELECT TO_DATE(‘01-JAN-93’+.999999)
FROM DUAL;
Returns:
’
譯者按:
雖然本節和SQL最佳化沒有關係, 但是作者的功力可見一斑
51. 使用顯式的遊標(CURSORs)
使用隱式的遊標,將會執行兩次操作. 第一次檢索記錄, 第二次檢查TOO MANY ROWS 這個exception . 而顯式遊標不執行第二次操作.
52. 最佳化EXPORT和IMPORT
使用較大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度.
將盡可能地獲取你所指定的大小,即使在記憶體不滿足,也不會報錯.這個值至少要和表中最大的列相當,否則列值會被截斷.
譯者按:
可以肯定的是, 增加BUFFER會大大提高EXPORT , IMPORT的效率. (曾經碰到過一個CASE, 增加BUFFER後,IMPORT/EXPORT快了10倍!)
作者可能犯了一個錯誤: “這個值至少要和表中最大的列相當,否則列值會被截斷. “
其中最大的列也許是指最大的記錄大小.
關於EXPORT/IMPORT的最佳化,CSDN論壇中有一些總結性的貼子,比如關於BUFFER引數, COMMIT引數等等, 詳情請查.
53. 分離表和索引
總是將你的表和索引建立在不同的表空間內(TABLESPACES). 決不要將不屬於ORACLE內部的存放到SYSTEM表空間裡. 同時,確保資料表空間和索引表空間置於不同的上.
譯者按:
“同時,確保資料表空間和索引表空間置與不同的硬碟上.”可能改為如下更為準確 “同時,確保資料表空間和索引表空間置與不同的硬碟控制卡控制的硬碟上.”
(全文完)
Black_Snail
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962240/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE SQL效能最佳化系列 (十) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (十一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (二) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (三) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (四) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (九) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (五) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (八) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (六) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (七) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (十二) (轉)OracleSQL
- Oracle SQL效能最佳化系列講座之三(轉)OracleSQL
- Oracle SQL效能最佳化系列講座之二(轉)OracleSQL
- Oracle SQL效能最佳化系列講座之一(轉)OracleSQL
- Delphi程式碼最佳化 完結篇 (轉)
- Oracle效能最佳化之SQL最佳化(轉)OracleSQL
- oracle SQL效能最佳化大總結OracleSQL
- Oracle SQL效能最佳化OracleSQL
- Oracle sql 效能最佳化OracleSQL
- JavaScript深入系列15篇正式完結!JavaScript
- JavaScript專題系列20篇正式完結!JavaScript
- Oracle SQL效能最佳化常用方法OracleSQL
- 瀏覽器原理系列10篇正式完結瀏覽器
- VuePress 部落格搭建系列 33 篇正式完結!Vue
- Oracle 效能最佳化小結Oracle
- Oracle SQL最佳化總結OracleSQL
- 我的WebDesign之路--完結篇 (轉)Web
- ORACLE SQL效能優化系列 (一)OracleSQL優化
- C# 資料操作系列 - 16 SqlSugar 完結篇C#SqlSugar
- Oracle SQL的最佳化[轉]OracleSQL
- Oracle SQL效能優化系列介紹OracleSQL優化
- Oracle效能最佳化之應用最佳化(轉)Oracle
- Oracle效能最佳化之最佳化排序操作(轉)Oracle排序
- 爬蟲掙錢系列-(完結篇)結構化人名掙錢第三篇爬蟲
- 連載四:Oracle升級文章大全(完結篇)Oracle
- Oracle效能最佳化之LockContention(轉)Oracle
- C# 資料操作系列 - 9. EF Core 完結篇C#