2009-11-10 101 views
2

查詢優化對於SQL Server有不同順序的WHERE子句有什麼區別嗎?SQL Server的WHERE子句的排序

例如,將這個查詢計劃:

select * from table where col1 = @var1 and col2 = @var2 

不同從這個?:

select * from table where col2 = @var2 and col1 = @var1 

當然,這是一個人爲的例子,我曾嘗試更復雜的了。查詢計劃對於兩者來說都是一樣的,但我總是想知道是否值得排序WHERE子句,使得最具體的子句最先出現,以防優化器以某種方式「修剪」結果並最終變得更快。

這實際上只是一個思想實驗,我並不想解決特定的性能問題。

其他RDBMS的呢?

+0

如果col1有一個索引,而col2沒有,它可能會有所不同。 – rsp 2009-11-10 10:50:05

+0

@rsp從人們所說的話來看,如何格式化查詢並不會產生什麼影響 - 查詢優化器無論如何都會自己動手,並根據哪些列有索引等命令謂詞。 – 2009-11-10 11:07:51

回答

5

每個現代的RDBMS都有一個查詢優化器,它負責重新排序條件。有些優化器使用相當複雜的統計數據來做到這一點,而且他們經常打敗人類直覺,認爲什麼是好的排序,哪些不會。所以我的猜測是:如果你可以肯定地說「這個順序比另一個更好」,那麼優化器也可以自行計算出來。

結論:不要擔心這樣的事情。這是很少值得的時間。

+0

是的,那是我的假設,但我想如果我想知道它,那麼也許別人也可能有:)。 – 2009-11-10 10:59:34

+0

想知道從來沒有錯:-) – 2009-11-10 11:01:04

+1

有時你需要擔心這樣的事情,以優化您的應用程序,並使他們擴展到現實世界的需求 – Sanket 2009-11-10 11:12:28

1

不,查詢優化器無論如何都會找出要使用的索引或統計信息。我不完全確定,但我甚至認爲sql中的布爾表達式不是從左到右計算的,但可以按查詢優化器以任何順序進行評估。

0

我不認爲它會有很大的區別.. 什麼是所有的SQL語言有所不同是您使用SQL函數的順序。

例如: 當你做這樣的事情:

select title, date FROM sometable WHERE to_char(date, 'DD-MM-YYYY') > "01-01-1960" 

會去慢那麼這樣的:

select title, date FROM sometable WHERE date > to_char('DD-MM-YYYY', %USERVALUE%) 

這是因爲該功能需要進行評估的次數。

0

另外,如果您使用嵌套查詢,排序可能會有所不同。內部查詢的結果集越小,對外部查詢的掃描就越少。 當然,話雖如此,我第二什麼rsp在上面的評論中說 - 索引是確定查詢將花多長時間的主要關鍵;如果我們在列上有一個索引,SQL Server將直接執行SEEK而不是掃描值,因此,排序會變得不相關

2

當您確定條件的順序時,人類的可讀性應該是您唯一的目標在where子句中。例如,如果您在兩個表A和B上加入了連接,則爲A寫入所有條件,然後爲B寫入所有條件。

+0

我完全同意,所以我upvoted你的答案。讓我想起了那句着名的引語:「程序必須是爲人們閱讀而寫的,而且只是偶然地讓機器執行。」 – 2009-11-10 12:36:36

+0

湯姆:正好和thx爲upvote * ggg * – 2009-11-10 12:49:52

0

SQL是「declarative」,因此它沒有區別。你告訴數據庫管理系統你想要什麼,它會計算出最好的方式(按照成本,時間等)。

在.net中,它會有所作爲,因爲它是procedural並按順序執行。