原作者網址:http://pighead2002.pixnet.net/blog/post/56706340-oracle-%E6%95%88%E8%83%BD%E8%AA%BF%E6%A0%A1%E4%B9%8B%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A2%BA%E4%BD%BF%E7%94%A8sql

 

1、避免在索引欄上使用IS NULL 或IS NOT NULL

Oracle的索引是主要是b-tree的架構

由於B-TREE的索引裡,不包含NULL值

所以當SQL查詢的條件是指定使用ISNULL或IS NOT NULL,OracleOptimizer將無法使用索引

處理方法:可以將NULL值都補成其他沒有意義的值,如0或是-1。

 

2、盡量不使用!=篩選資料

由於索引只能告知什麼樣的資料存在於表格中,而不能告知什麼樣的資料不存在,所以使用!=或<> 即代表使用全表格掃描。
處理方法:可以利用> 或 IN 取代不等於符號 。
 
3、不適當的函數或運算式
儘量避免在 where 子句中對欄位進行運算式操作。
儘量避免在where子句中對欄位進行函數操作。
不要在 where 子句中的“=”左邊進行函數、算術運算或其他運算式運算。
處理方法:可以將函數、算術運算或其他運算式移到右邊。或是利用其他方法取代。或是建立funcion-base index。
 
4、盡量不使用|| 來篩選資料
如果使用連結字串「|| 」的條件來篩選資料,等同函式運算,所以必須先將欄位裡的資料全部運算完,才能篩選,所以一定會進行全表格掃描。
處理方法:將條件分開即可。
 
5、不使用NOT
如果在索引欄位上使用NOT,會產生等同函式運算的效果,所以一定會進行全表格掃描。
處理方法NOT改用其他方式取代,如

NOT >             to

<=

NOT >=           to

<

NOT <             to

>=

NOT <=           to

>


6、慎用IN、OR
基本上IN和OR,等同於對全表格掃描完之後,再將符合的資料篩選出來,所以一定會做全表格掃描
處理方法:可以用BETWEEN或EXISTS取代
 
7、使用LIKE條件式
避免用前後都是%,如%DBA%。此情況絕對不會使用索引。
條件式後面有%,幾乎會用到索引
條件式前面有%,不會使用索引。(但可建REVERSE KEY INDEX)
 
8、複合索引的盲點
當索引是由多個欄位組成,就是所謂的複合索引,在一般的情況,Oracle Optimizer只會使用複合索引的第一個欄位。當條件是在第二個欄位上時,就有可能會使用全表格掃描。
 
9、沒有效率的條件式
儘量使用WHERE條件式取代ORDER BY
儘量使用WHERE條件式取代HAVING
使用UNION ALL 取代UNION
儘量使用NOT EXISTS取代NOT IN. 
 
10、其他
查詢語句中,盡量不使用「* 」。而是明確指定欄位名稱
要清空表格時,盡量使用TRUNCATE。
要使用COUNT全表格時,盡量使用PK或UniqueKey所在欄位。而不要用COUNT(*)
儘量用VACHAR取代CHAR
儘量使用數字型態。

 

創作者介紹
創作者 Bear-小小工程師學習筆記 的頭像
carefree55

Bear-小小工程師學習筆記

carefree55 發表在 痞客邦 留言(0) 人氣( 329 )