sql 優化整理

1.避免無計劃的全表掃描
如下情況進行全表掃描:
-該表無索引
-對返回的行無任何限制條件(無where子句)
-對索引主列(索引的第一列)無限制條件
-對索引主列的條件含在表達式中
-對索引主列的限制條件是is(not)null或!=
-對索引主列的限制條件是like操作 且 值是一個bind variable或%打頭的值
2.只使用選擇性索引
索引的選擇性是指索引列中不同值的數目和標誌中記錄數的比,選擇性最好的是非空列的唯一索引爲1.0。
複合索引中列的次序的問題:
1 在限定條件裏最頻繁使最清晰的列)應該是主列
如果1和2 不一致,可用的列應該是主列
2 最具有選擇性的列(即以考慮建立多個索引。
在複合索引和多個單個索引中做選擇:
考慮選擇性 考慮讀取索引的次數 考慮AND-EQUAL操作
3.管理多表連接(Nexted Loops,Merge Joins 和Hash Joins)優化聯接操作
Merge joins是集合操作 nested loops 和hash joins 是記錄操作返回第一批記錄迅速
Merge joins的操作適用於批處理操作,巨大表和遠程查詢
1全表掃描–>2排序–>3比較和合並 性能開銷主要在前兩步
適用全表掃描的情形,都適用merge joins操作(比nested loops有效)
改善1的效率:優化I/O,提高使用ORACLE多塊讀的能力,使用並行查詢的選項
改善1的效率:提高Sort_Area_Size的值,使用Sort Direct Writes,爲臨時段提供專用表空間
4.管理包含視圖的SQL語句
優化器執行包含視圖的SQL語句有兩種方法:
-先執行視圖,完成全部的結果集,然後用其餘的查詢條件做過濾器執行查詢
-將視圖文本集成到查詢裏去
含有group by子句的視圖不能被集成到一個大的查詢中去。
在視圖中使用union,不阻止視圖的sql集成到查詢語法中去。
5.優化子查詢
6.使用複合keys/star 查詢
7.恰當地索引Connect By 操作
8.限制對遠程表的訪問
9.管理非常巨大的表的訪問
-管理數據接近(proximity)記錄在表中的存放按對錶的範圍掃描中最長使用的列排序,按次序存儲數據有助於範圍掃描,尤其是對大表。
-避免沒有幫助的索引掃描 當返回的數據集合較大時,使用索引對SGA的數據塊緩存佔用較大,影響其他用戶;全表掃描還能從ORACLE的多塊讀取機制和“一致性獲取/每塊”特性中受益。
-創建充分索引的表 使訪問索引能夠讀取較全面的數據,建立僅主列不同的多個索引
-創建hash簇
-創建分割表和視圖
-使用並行選項
10. 使用Union All而不是Union
Union all 操作不包括sort unique 操作,第一行索引的響應速度快,多數情況下不用臨時段完成操作
Union all 建立的視圖用在查詢裏可以集成到查詢的語法中去,提供效率
11.避免在sql裏使用pl/sql功能調用
12.綁定變量(bind variable)的使用管理
使用bind bariable 和execute using 方式
將like:name||’%’改寫成between:name and :name||char(225),已避免進行全表掃描,而是使用索引。
13.回訪優化進程
數據變化後,重新考察優化情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章