13個(gè)SQL優(yōu)化技巧
1?避免無(wú)計(jì)劃的全表掃描
??如下情況進(jìn)行全表掃描:
-??????????該表無(wú)索引
-??????????對(duì)返回的行無(wú)人和限制條件(無(wú)Where子句)
-??????????對(duì)于索引主列(索引的第一列)無(wú)限制條件
-??????????對(duì)索引主列的條件含在表達(dá)式中
-??????????對(duì)索引主列的限制條件是is (not) null或!=
-??????????對(duì)索引主列的限制條件是like操作且值是一個(gè)bind variable或%打頭的值
2?只使用選擇性索引
???索引的選擇性是指索引列中不同值得數(shù)目和標(biāo)志中記錄數(shù)的比,選擇性最好的是非空列的唯一索引為1.0。
復(fù)合索引中列的次序的問(wèn)題:
??1?在限定條件里最頻繁使用的列應(yīng)該是主列
??2?最具有選擇性的列(即最清晰的列)應(yīng)該是主列
??如果1和2?不一致,可以考慮建立多個(gè)索引。
在復(fù)合索引和多個(gè)單個(gè)索引中作選擇:
??考慮選擇性?考慮讀取索引的次數(shù)??考慮AND-EQUAL操作
?
3?管理多表連接(Nested Loops, Merge Joins和Hash Joins)??優(yōu)化聯(lián)接操作
??Merge Joins是集合操作??Nested Loops和Hash Joins是記錄操作返回第一批記錄迅速
Merge Joins的操作適用于批處理操作,巨大表?和遠(yuǎn)程查詢
?1全表掃描??--〉?2排序???--〉3比較和合并??性能開(kāi)銷(xiāo)主要在前兩步
??適用全表掃描的情形,都適用Merge Joins操作(比Nested Loops有效)。
??改善1的效率:?優(yōu)化I/O,?提高使用ORACLE多塊讀的能力,?使用并行查詢的選項(xiàng)
??改善1的效率:提高Sort_Area_Size的值,?使用Sort Direct Writes,為臨時(shí)段提供專(zhuān)用表空間
4?管理包含視圖的SQL語(yǔ)句
??優(yōu)化器執(zhí)行包含視圖的SQL語(yǔ)句有兩種方法:
-??????????先執(zhí)行視圖,完成全部的結(jié)果集,然后用其余的查詢條件作過(guò)濾器執(zhí)行查詢
-??????????將視圖文本集成到查詢里去
含有g(shù)roup by子句的視圖不能被集成到一個(gè)大的查詢中去。
在視圖中使用union,不阻止視圖的SQL集成到查詢的語(yǔ)法中去。
5?優(yōu)化子查詢
6?使用復(fù)合Keys/Star查詢
7?恰當(dāng)?shù)厮饕鼵onnect By操作
8?限制對(duì)遠(yuǎn)程表的訪問(wèn)
9?管理非常巨大的表的訪問(wèn)
-??????????管理數(shù)據(jù)接近(proximity)?記錄在表中的存放按對(duì)表的范圍掃描中最長(zhǎng)使用的列排序?按次序存儲(chǔ)數(shù)據(jù)有助于范圍掃描,尤其是對(duì)大表。
-??????????避免沒(méi)有幫助的索引掃描?當(dāng)返回的數(shù)據(jù)集合較大時(shí),使用索引對(duì)SGA的數(shù)據(jù)塊緩存占用較大,影響其他用戶;全表掃描還能從ORACLE的多塊讀取機(jī)制和“一致性獲取/每塊”特性中受益。
-??????????創(chuàng)建充分索引的表??使訪問(wèn)索引能夠讀取較全面的數(shù)據(jù)??建立僅主列不同的多個(gè)索引
-??????????創(chuàng)建hash簇
-??????????創(chuàng)建分割表和視圖
-??????????使用并行選項(xiàng)
10?使用Union All?而不是Union
???UNION ALL操作不包括Sort Unique操作,第一行檢索的響應(yīng)速度快,多數(shù)情況下不用臨時(shí)段完成操作,
???UNION ALL建立的視圖用在查詢里可以集成到查詢的語(yǔ)法中去,提高效率
11?避免在SQL里使用PL/SQL功能調(diào)用
12?綁定變量(Bind Variable)的使用管理
???使用Bind Variable和Execute using方式
???將like :name ||’%’?改寫(xiě)成?between :name and :name || char(225),?已避免進(jìn)行全表掃描,而是使用索引。
13?回訪優(yōu)化進(jìn)程
???數(shù)據(jù)變化后,重新考察優(yōu)化情況