13個SQL優化技巧

避免無計劃的全表掃描

  如下情況進行全表掃描:

-          該表無索引

-          對返回的行無任何限制條件(無Where子句)

-          對於索引主列(索引的第一列)無限制條件

-          對索引主列的條件含在表達式中

-          對索引主列的限制條件是is (not) null!=

-          對索引主列的限制條件是like操作且值是一個bind variable%打頭的值

只使用選擇性索引

   索引的選擇性是指索引列中不同值得數目和標誌中記錄數的比,選擇性最好的是非空列的唯一索引爲1.0

複合索引中列的次序的問題:

  1 在限定條件裏最頻繁使用的列應該是主列

  2 最具有選擇性的列(即最清晰的列)應該是主列

  如果1不一致,可以考慮建立多個索引。

在複合索引和多個單個索引中作選擇:

  考慮選擇性 考慮讀取索引的次數  考慮AND-EQUAL操作

 

管理多表連接(Nested Loops, Merge JoinsHash Joins  優化聯接操作

  Merge Joins是集合操作  Nested LoopsHash Joins是記錄操作返回第一批記錄迅速

Merge Joins的操作適用於批處理操作,巨大表 和遠程查詢

 1全表掃描  -- 2排序   --3比較和合並  性能開銷主要在前兩步

  適用全表掃描的情形,都適用Merge Joins操作(比Nested Loops有效)。

  改善1的效率: 優化I/O 提高使用ORACLE多塊讀的能力, 使用並行查詢的選項

  改善1的效率:提高Sort_Area_Size的值, 使用Sort Direct Writes,爲臨時段提供專用表空間

管理包含視圖的SQL語句

  優化器執行包含視圖的SQL語句有兩種方法:

-          先執行視圖,完成全部的結果集,然後用其餘的查詢條件作過濾器執行查詢

-          將視圖文本集成到查詢裏去

含有group by子句的視圖不能被集成到一個大的查詢中去。

在視圖中使用union,不阻止視圖的SQL集成到查詢的語法中去。

優化子查詢

使用複合Keys/Star查詢

恰當地索引Connect By操作

限制對遠程表的訪問

管理非常巨大的表的訪問

-          管理數據接近(proximity) 記錄在表中的存放按對錶的範圍掃描中最長使用的列排序 按次序存儲數據有助於範圍掃描,尤其是對大表。

-          避免沒有幫助的索引掃描 當返回的數據集合較大時,使用索引對SGA的數據塊緩存佔用較大,影響其他用戶;全表掃描還能從ORACLE的多塊讀取機制和“一致性獲取/每塊”特性中受益。

-          創建充分索引的表  使訪問索引能夠讀取較全面的數據  建立僅主列不同的多個索引

-          創建hash

-          創建分割表和視圖

-          使用並行選項

10 使用Union All 而不是Union

   UNION ALL操作不包括Sort Unique操作,第一行檢索的響應速度快,多數情況下不用臨時段完成操作,

   UNION ALL建立的視圖用在查詢裏可以集成到查詢的語法中去,提高效率

11 避免在SQL裏使用PL/SQL功能調用

12 綁定變量(Bind Variable)的使用管理

   使用Bind VariableExecute using方式

   like :name ||’%’ 改寫成 between :name and :name || char(225), 已避免進行全表掃描,而是使用索引。

13 回訪優化進程

   數據變化後,重新考察優化情況

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