sql語句性能優化


記錄一下關於SQL語句性能優化的一些要點:

  • from子句表的順序,記錄越多的表放在越前面(左),右邊的表位驅動表,驅動表越小,最終掃描的數據越少。oracle解析器按照從右向左的順序處理from子句中的表名,最右的表將被最先處理。如果有3個以上的表連接查詢,那就需要選擇交叉表(intersection table)作為基礎表,交叉表是指那個被其它表所引用的表。
  • where子句表達式的順序,過濾掉最大數目記錄的條件放到where子句的末尾。oracle的執行計划的條件過濾從最后向前進行,過濾數據最多的在最后可以提高數據庫的查詢速度。
  • select子句中避免使用‘*’,oracle在解析的過程中會將‘*’一次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這樣將耗費更多的時間。
  • 在執行結果等效的情況下,使用truncate代替delete。當刪除表中記錄時,在通常情況下,回滾段用來存放可以被恢復的信息,如果沒有commit事務,oracle會將數據恢復到刪除之前的狀態。使用truncate時,回滾段不再存放任何可恢復的信息,數據不能被恢復。
  • 在查詢過程中篩選條件較多時要盡量使用索引,對於like語句避免使用右匹配或者中間匹配的模糊查詢。
  • 將過濾條件盡可能放到where子句中,而不是放到having子句中。having子句是用來對分組后的結果進行過濾,限制分組后的查詢結果。having子句會再檢索出所有記錄之后才對結果集進行過濾,而且在使用having子句時一般需要執行排序、統計等操作。執行這些操作時,sql優化器會進行一些額外的工作,這就需要消耗額外的時間。
  • 使用表的別名可以減少解析的時間並避免引起歧義。
  • 使用exists替代in,用not exists替代not in。
  • 通常情況下,采用表連接的方式比exists更有效率。
  • 使用‘>=’替代‘>’,這樣可直接跳到等於的記錄上,會避免向前的掃描工作。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com