SQL語句中where 1=1 對性能的影響,where 與having的區別,where子句的性能

1,where 1=1 對性能的影響
很多時候,使用where 1=1 可以很方便的解決我們的問題,但是這樣很可能會造成非常大的性能損失,因爲添加使用了 “where 1=1 ”的過濾條件以後數據庫系統就無法上使用索引等查詢優化策略,數據庫系統將會被迫 對每行數據進行掃描(也即是全表掃描) 以比較此行是否滿足過濾條件,當表中的數據量較大時候 查詢速度會非常慢。因此如果對性能有比較高的要求就不要使用這種簡便的方式了。

2,HAVING 語句 

有的時候需要對部分分組進行過濾,比如只檢索人數多餘1個的年齡段,有的開發人員會使 用下面的SQL語句: 

SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge WHERE COUNT(*)>1 

可以在數據庫系統中執行下面的SQL的時候,數據庫系統會提示語法錯誤,這是因爲聚合函數不能在WHERE語句中使用,必須使用HAVING子句來代替,比如:

 SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1


3,where子句的性能

(1)WHERE子句中的連接順序
sql解析器採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前,那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾

SELECT … FROM emp e WHERE sal>50000 AND job=‘MANAGER’AND 25<(SELECT COUNT(*) FROM emp WHERE mgr=e.empno);

效率低於

SELECT… FROM emp e WHERE 25<(SELECT COUNT(*) FROM emp WHERE mgr=e.empno) AND sal>50000 AND job=‘MANAGER’;

(2)選擇最有效率的表名順序
sql解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理。在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作爲基礎表

如果tab2中記錄數明顯高於tab1,用
SELECT COUNT(*) FROM tab2, tab1
效率明顯優於
SELECT COUNT(*) FROM tab1, tab2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章