close

最近都在幫公司的同事針對Oracle的部份做教育訓練

這兩個星期開始講效能調校的部份

因為同事大多是程式設計師

會需要學習的效能調部份,應該就只有SQL調校的部份

整理一下之前工作上常常遇到的問題,向大家分享

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























 

 

arrow
arrow

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