2009-04-20 66 views
4

說我有一個表您編寫sql查詢的方式會影響性能嗎?

Id int 
Region int 
Name nvarchar 

select * from table1 where region = 1 and name = 'test' 

select * from table1 where name = 'test' and region = 1 

會不會有性能上的區別嗎? 假設沒有索引

與LINQ是否一樣?

回答

7

因爲您的限定符本質上實際上是相同的(無論放置where子句的順序如何),那麼不,這兩者之間沒有區別。對於LINQ,您需要知道LINQ to SQL實際發出的查詢(您可以使用SQL Profiler查找)。有時候,查詢將是您可以想到的最簡單的查詢,有時候這種查詢會變得複雜多變,因爲諸如FK或其他類似約束條件的依賴關係。 LINQ也不會使用*作爲選擇。

要知道的唯一真正的方法是找出兩個查詢的SQL Server查詢執行計劃。要了解更多的話題,請到這裏:

SQL Server Query Execution Plan Analysis

3

應該嗎?不.SQL是一個關係代數,DBMS應該優化,而不管語句中的順序如何。

是嗎?有可能。儘管他們已經被告知了某些DBMS'可能以某種順序存儲數據(例如,保持某種類型的密鑰)。但是,這是關鍵:你不能依賴它。

您可能需要在將來某個時候切換DBMS'。即使更高版本的相同 DBMS可能會改變其行爲。你應該依賴的唯一東西是SQL標準中的內容。

關於給出的查詢:在所涉及的兩個字段中沒有索引或主鍵,您應該假設您需要對兩種情況進行全表掃描。因此他們應該以相同的速度運行。

1

我不推薦*,因爲發動機應查找表計劃執行查詢之前。而是使用您希望避免不必要開銷的表字段。

是的,引擎優化您的查詢,但幫助他:)。

最好的問候!

1

對於簡單的查詢,可能幾乎沒有差別,但是確實,您編寫查詢的方式可能會對性能產生巨大影響。

在SQL Server中(性能問題與數據庫相關的特定問題),與在派生表中進行連接時執行相同操作相比,相關子查詢的性能通常較差。

在查詢其他的東西,可能會影響性能,包括使用可優化搜索 where子句來代替非可優化搜索的,只選擇你需要的領域,從來沒有使用select *(尤其是不能做一個連接的至少一個時字段重複),使用基於集合的查詢而不是遊標,避免使用通配符作爲類似子句中的第一個字符等等。有很多書籍會將章節用於更有效的編寫查詢的方式。

對於那些不知道的人來說,「SARGable」是DB2術語(可能還有其他DBMS)中的階段1謂詞。階段1謂詞更高效,因爲它們是索引的一部分,DB2首先使用它們。