2011-06-06 78 views
3

考慮類似的查詢:冗餘SQL查詢中的謂詞是否會影響性能?

select * 
from t 
where a = 5 and (a = 5 and b = 7) 

是否冗餘謂詞a = 5影響查詢的性能。我不相信,但我被告知否則(是的,我知道它取決於DBMS,但假設它是一些企業級的DBMS,如SQL Server,DB2或Oracle)。

+2

第一個條件是沒有意義的,在第二個條件下也是如此。 – 2011-06-06 15:54:26

+0

我會建議你在執行計劃oeing解釋計劃,看看是否有不同的優化器處理。但個人而言,由於維護原因,我會拿出冗餘條款。 – HLGEM 2011-06-06 15:56:31

+0

這個查詢對我有意義的唯一方法是如果where子句就像'where a = 5 or(a = 5 and b = 7) ' – 2011-06-06 15:57:16

回答

4

答案通常是否定的,冗餘條款不會影響性能。當然,作爲一名程序員,你可以使用證據來證明它是一種方式或另一種方式(不同於那些將他們的神話重複爲事實的人)。

只要打開您的選擇數據庫,輸入您的查詢有和沒有redundent子句,然後要求您的數據庫到explain這兩個查詢。

例如在SQL Server Management Studio(MS SQL Server)中打開查詢窗口,輸入您的查詢,然後右鍵單擊並選擇「顯示估計執行計劃」(或者您可以選擇一個選項以顯示實際計劃查詢運行)。

+0

+1,它不會影響性能的原因是您的DBA確實/應該對where子句進行短路評估(參見:http://en.wikipedia.org/wiki/Short-circuit_evaluation),並將停止只要結果是明確的「真實」或「虛假」,就進行測試 – Johan 2011-06-06 17:46:39

+0

@Johan:短路在這裏如何起作用?對於a == 5 && a == 5 && b == 7'的天真短路,其中'a == 5'爲真的某些行可以評估兩次「a == 5」的真相。 – Fred 2011-06-06 18:12:48

+0

@Fred,閱讀鏈接,當你理解**短路評估是什麼時回來。 *提示**不**有關做事兩次* – Johan 2011-06-06 18:17:59

3

我想引用來自The Law of Leaky Abstractions by Joel Spolsky

下面的SQL語言是爲了抽象 掉那些 需要查詢數據庫的程序步驟,而不是 允許你定義只是你 想讓數據庫找出 的程序步驟來查詢它。但在某些情況下, 某些SQL查詢的速度比其他 慢 邏輯等效查詢。這方面的一個著名 例子是,一些SQL 服務器都大大加快,如果你 指定「其中A = B和B = C,且A = C」 比,如果你只指定「,其中A = B 和B = C 「儘管結果集是 一樣。你不應該有 關心的程序,只有 規範。但有時 抽象泄漏,並導致可怕的 性能,你必須打破 查詢計劃分析器和研究什麼 它做錯了,並找出如何 使您的查詢運行更快。