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
儘量使用數字型態。
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
0 留言