2011-12-07 57 views
2

1)這兩個查詢之間會有任何性能差異嗎?

select * from student_tbl A ,result_tbl B where 
A.student_name = B.student_name and 
A.student_name = "xyz" ; 

2)

select * from student_tbl A ,result_tbl B where 
A.student_name = "xyz" and 
A.student_name = B.student_name ; 

我知道,這些查詢的結果都是一樣的。 是否有任何性能差異?如果是這樣,請解釋原因。

+1

無論可能存在的差異(如果有的話)都可能是實現特定的。對我而言,這屬於「微觀優化」類別。爲什麼不設置一個測試用例並在測試結果非常重要時進行測量? – spender

+1

@spender我*猜*這是作業。可能是錯的。我只是因爲再次錯誤而已......這已經過去了幾秒鐘! ;) –

+0

@andrew barber我剛纔在我的問題中給了一個簡單的例子。實際上他們有2個表格,數據量很大。 – user1085296

回答

2

這些都是一樣的。 where子句中的條件意味着A.student_name和B.student_name都是「xyz」。查詢優化器很可能會爲兩者生成相同的執行計劃,但您可以通過檢查執行計劃來檢查這一點(例如,在SQL Server Management Studio中,如果使用MS SQL Server)。

+0

他們是一樣的嗎?假設謂詞的評估順序對於每一行都是相同的。現在假設大量候選人滿足一個謂詞但不滿足第二個謂詞。假設運行查詢的enqine使用快捷方式評估。他們仍然是一樣的嗎?可能差不多,但你能確定嗎? – spender

+0

@spender我的意思是很容易想象一個好的查詢優化器會做什麼:它將結合來自A和B的那些student_name爲「xyz」的元組。至少我無法想象一個更優化的生成結果集的方式。實際的實現取決於你使用的DBMS,這就是爲什麼我建議比較執行計劃。 – kol

+2

@downvoter請解釋downvote,讓我學習... – kol

6

查詢不像程序那樣執行。他們不是做第1步然後第2步的程序。相反,它們是關於你想要的結果的聲明性陳述。在大多數現代RDBMS中,任何給定的查詢都可以通過許多不同的查詢計劃來執行。通常,創建不同的查詢計劃,然後評估哪個計劃運行得最快。在創建一系列查詢計劃時,它會考慮應首先評估哪些條件,應該在評估條件之前或之後進行連接,以及嘗試確定哪些條件會被禁食(基於其對於表格大小並猜測表格的百分比將包含在給定條件下)。他們中的許多人也會查看以前的結果,以便爲未來的決策提供有關其近似值出錯的信息。

最有可能的,在任何現代RDBMS,這兩個查詢會產生相同的一組查詢計劃,因此同樣的選擇將作出,導致相同的查詢計劃的兩個查詢被執行。根據您正在使用的RDBMS,通常可以使用工具查看爲給定查詢選擇的特定查詢計劃,因此您可以使用該工具針對特定數據庫上的兩個特定查詢絕對回答問題。

現在,他說,我要指出,這並不等於說「它總是會產生相同的數據相同的答案任意兩個查詢將始終以相同的時間量。」有可能編寫非常糟糕的查詢,主要是通過不必要的複雜性,並且不能保證查詢規劃者會意識到您已經過度了。它可能會捕獲簡單的情況。因此,例如:

SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND 
A.student_name = 'xyz' AND 
B.student_name = A.student_name 

也可能會產生相同的查詢計劃。而這也可能:

SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND 
A.student_name = 'xyz' AND 
B.student_name = 'xyz' 

但是,如果你做的東西非常複雜的像

(SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND 
A.student_name = 'xyz') 
UNION 
(SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = B.student_name AND 
B.student_name = 'xyz') 
INTERSECT 
(SELECT * FROM student_tbl A, result_tbl B WHERE 
A.student_name = 'xyz') 

它可以運行更復雜的查詢計劃。 (即使這個完全不必要的複雜查詢會產生與其他兩個相同的結果(假設沒有NULL))。

因此,優化器不是無所不知的,但它們傾向於認識到X和Y與Y和X是同一事物,並且A = B和B = C與A = C和A = B並針對這些情況進行相應調整。他們實際上做了各種轉換,試圖找到最好的查詢,並且通常很擅長查找它。可以重寫查詢計劃程序的決策,但只有在確定有更好的方法來執行查詢並且數據更改不可能改變查詢時才能完成。

2

假設您使用的是Sql服務器,您可以爲每個服務器顯示執行計劃並查看實際發生的情況,這將顯示每個操作的成本以及查詢實際對每個表執行的操作。

對於深度較淺的外觀,您還可以運行查詢並檢查執行時間。

我懷疑這裏真正的問題是「where子句中的條件順序是否影響性能?」在這種情況下,您可能希望閱讀此SO帖子Does the order of columns in a WHERE clause matter?

相關問題