SQL優化的最終目的是用戶體驗-在最短時間內讓用戶在頁面數據。因此,執行時間是SQL優化的重要指標。在SQL查詢中,I/O操作最占系統性能的。I/O操作量越大,時間越久。減少I/O操作量是優化SQL的目標。同時,CPU,緩存命中率也很重要。 並不是所有SQL都需要被優化,使用頻率高,性能差的SQL語
SQL優化的最終目的是用戶體驗-在最短時間內讓用戶在頁面數據。因此,執行時間是SQL優化的重要指標。在SQL查詢中,I/O操作最占系統性能的。I/O操作量越大,時間越久。減少I/O操作量是優化SQL的目標。同時,CPU,緩存命中率也很重要。
並不是所有SQL都需要被優化,使用頻率高,性能差的SQL語句需要重點被優化。可以通過查看v$sqlarea表,訪問OEM來查找。
註意不同版本的Oracle使用不同的優化器。11g的優化器基於代價(Cost Based Optimizer)(考慮SQL執行耗費的資源代價)11g之前是基於規則來優化的(Rule Based Optimizer)。優化要針對優化器來完成。
1.合理使用索引
原理:ORACLE是按行存儲數據的(ROWID是行的位置) 而查詢條件是列的,數據結構不同,查找速度慢。 建立按列存儲的索引可以按列查找,數據在一個區域內,速度快。(弊端:事務處理起來不方便,增加了Insert, Update的執行時間)
原則:
適合使用索引的列:
1.經常被查詢的列
2.經常排序分組的列
3.經常連接的列
不適合使用索引的列
1.數據經常更改的列
2.數據量小、重覆性高的列
註意:
1.給索引指定單獨的表空間可以增加IO性能
2.表完全導入完畢後再創立索引
3.表中總索引數不易過大
2.SQL語句的優化
1.用列名代替*
使用*,SQL會對每個列進行匹配,降低效率
2.當表與其他表沒有任何關聯時,可以用TRUNCATE代替DELETE
TRUNCATE沒有事務控制,性能高,但是要註意無法被rollback
針對11g之前的優化方法 (基於規則的優化器)
1. 用EXISTS代替IN,DISTINCT
2. 二連表查詢時,選擇數據少的表作為驅動表(放在FROM的表列表的最後面)。迴圈驅動表中的數據和另一個表中的數據作連接查詢。多表聯查時,選擇關聯最多的表。
3. 表連接條件放前面,過濾記錄多的條件的子句放後面(因為SQL執行順序是從右到左)
3.表分區
將數據量大的表分區也可以提升查詢效率,還可以方便表的管理,備份,和恢復,提高表的安全性。
分區方法:
範圍分區
散列分區(根據哈希值)
列表分區 (明確指定列來分區)
指定分區查詢
select * from table partition(pt_rule);