1. 程式人生 > 其它 >SQL優化技術分析-1:操作符優化

SQL優化技術分析-1:操作符優化

https://www.cnblogs.com/wd775/p/5672840.html
1、IN 操作符   

  用IN寫出來的SQL的優點是比較容易寫及清晰易懂,這比較適合現代軟體開發的風格。但是用IN的SQL
效能總是比較低的,從Oracle執行的步驟來分析用IN的SQL與不用IN的SQL有以下區別:  

  ORACLE試圖將其轉換成多個表的連線,如果轉換不成功則先執行IN裡面的子查詢,再查詢外層的表記
錄,如果轉換成功則直接採用多個表的連線方式查詢。由此可見用IN的SQL至少多了一轉換的過程。一般的
SQL都可以轉換成功,但對於含有分組統計等方面的SQL就不能轉換了。  

  推薦方案:在業務密集的SQL當中儘量不採用IN操作符,用EXISTS 方案代替。  

  2、NOT IN操作符   

  此操作是強列不推薦使用的,因為它不能應用表的索引。   

  推薦方案:用NOT EXISTS 方案代替   

  3、IS NULL 或IS NOT NULL操作(判斷欄位是否為空)   

  判斷欄位是否為空一般是不會應用索引的,因為索引是不索引空值的。
IS NULL 與 IS NOT NULL不能用NULL作為索引,任何包含NULL值的列都將不會被包含在索引中。即使索引
有多列這樣的情況下,只要這些列中有一列含有NULL,該列就會從索引中排除。也就是說如果某列存在空值,即使
對該列建索引也不會提高效能。任何在WHERE子句中使用IS NULL或IS NOT NULL的語句優化器是不允許使用索引的。
故如果要在某欄位上建索引,則該欄位不能為空,可以用一個預設值代替空值。
  推薦方案:用其它相同功能的操作運算代替,如:a is not null 改為 a>0 或a>’’等。不允許欄位為空,
而用一個預設值代替空值,如申請中狀態欄位不允許為空,預設為申請。
故如果要在某欄位上建索引,則該欄位不能為空,可以用一個預設值代替空值。
  4、> 及 < 操作符(大於或小於操作符)   

  大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況下可以對它進
行優化,如一個表有100萬記錄,一個數值型欄位A,30萬記錄的A=0,30萬記錄的A=1,39萬記錄的A=2,1萬記
錄的A=3。那麼執行A>2與A>=3的效果就有很大的區別了,因為A>2時ORACLE會先找出為2的記錄索引再進行比較,
而A>=3時ORACLE則直接找到=3的記錄索引。   

  5、LIKE操作符   

  LIKE操作符可以應用萬用字元查詢,裡面的萬用字元組合可能達到幾乎是任意的查詢,但是如果用得不好則會
產生效能上的問題,如LIKE ‘%5400%’ 這種查詢不會引用索引,而LIKE ‘X5400%’則會引用範圍索引。   

  一個實際例子:用YW_YHJBQK表中營業編號後面的戶標識號可來查詢營業編號 YY_BH LIKE ‘%5400%’ 這個
條件會產生全表掃描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 則會利用YY_BH的索引進行兩
個範圍的查詢,效能肯定大大提高。   

  6、UNION操作符   

  UNION在進行錶鏈接後會篩選掉重複的記錄,所以在錶鏈接後會對所產生的結果集進行排序運算,刪除重複
的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最常見的是過程表與歷史表UNION。如:

  select * from gc_dfys

  union

  select * from ls_jg_dfys

  這個SQL在執行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,如果表數
據量大的話可能會導致用磁碟進行排序。   

  推薦方案:採用UNION ALL操作符替代UNION,因為UNION ALL操作只是簡單的將兩個結果合併後就返回。  

  select * from gc_dfys

  union all

  select * from ls_jg_dfys  

轉 https://www.cnblogs.com/wd775/p/5672840.html