1、盡量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。不用NOT IN操作符,可以用NOT EXISTS或者外連接+替代。
2、不用“<>”或者“!=”操作符。對不等于操作符的處理會(huì )造成全表掃描,可以用“<” or “>”代替。
3、Where子句中出現IS NULL或者IS NOT NULL時(shí),Oracle會(huì )停止使用索引而執行全表掃描??梢钥紤]在設計表時(shí),對索引列設置為NOT NULL。這樣就可以用其他操作來(lái)取代判斷NULL的操作。
4、當通配符“%”或者“_”作為查詢(xún)字符串的第一個(gè)字符時(shí),索引不會(huì )被使用。
5、對于有連接的列“||”,最后一個(gè)連接列索引會(huì )無(wú)效。盡量避免連接,可以分開(kāi)連接或者使用不作用在列上的函數替代。
6、如果索引不是基于函數的,那么當在Where子句中對索引列使用函數時(shí),索引不再起作用。Where子句中避免在索引列上使用計算,否則將導致索引失效而進(jìn)行全表掃描。
7、對數據類(lèi)型不同的列進(jìn)行比較時(shí),會(huì )使索引失效。
8、用“>=”替代“>”。
9、UNION操作符會(huì )對結果進(jìn)行篩選,消除重復,數據量大的情況下可能會(huì )引起磁盤(pán)排序。如果不需要刪除重復記錄,應該使用UNION ALL。
10、Oracle從下到上處理Where子句中多個(gè)查詢(xún)條件,所以表連接語(yǔ)句應寫(xiě)在其他Where條件前,可以過(guò)濾掉最大數量記錄的條件必須寫(xiě)在Where子句的末尾。
11、Oracle從右到左處理From子句中的表名,所以在From子句中包含多個(gè)表的情況下,將記錄最少的表放在最后。(只在采用RBO優(yōu)化時(shí)有效)
12、Order By語(yǔ)句中的非索引列會(huì )降低性能,可以通過(guò)添加索引的方式處理。嚴格控制在Order By語(yǔ)句中使用表達式。
13、不同區域出現的相同的Sql語(yǔ)句,要保證查詢(xún)字符完全相同,以利用SGA共享池,防止相同的Sql語(yǔ)句被多次分析。
14、多利用內部函數提高Sql效率。例如DECODE
15、當在Sql語(yǔ)句中連接多個(gè)表時(shí),使用表的別名,并將之作為每列的前綴。這樣可以減少解析時(shí)間。
需要注意的是,隨著(zhù)Oracle的升級,查詢(xún)優(yōu)化器會(huì )自動(dòng)對Sql語(yǔ)句進(jìn)行優(yōu)化,某些限制可能在新版本的Oracle下不再是問(wèn)題。尤其是采用CBO(Cost-Based Optimization,基于代價(jià)的優(yōu)化方式)時(shí)。
聯(lián)系客服