2010-02-12 23 views
4

在一個SQL查詢,並加入「TOP 1」是否將「TOP 1」添加到sql語句會顯着提高性能?

SELECT TOP 1 [values] FROM [TABLE] where [TABLE].Value = "ABC" 

給我的性能提升,當我知道只有這些記錄嗎?具體來說,我正在考慮LinqToSql和方法.Single(...).First(...),其中.First(...)增加了TOP 1到生成的SQL之間的差異。

LinqToSql已經感覺慢,所以我只是想辦法讓它更快。

編輯:在某些情況下,可能[TABLE].Value外鍵。

+0

你總是可以用探查器試一試。 – 2010-02-12 19:47:16

+0

不幸的是,我沒有在此服務器上運行分析器的訪問權限。 – 2010-02-12 19:49:21

回答

5

一旦找到第一個結果,TOP 1選擇應該終止,因此,根據您的查詢,它可能會快得多。另一方面,你真的想要考慮數據中未被發現的不一致性的語義和潛在含義。如果真的只有一個匹配,Single()是最合適的。如果您有多個匹配項並且正在使用Single(),您將得到一個異常並且知道您的數據或代碼中的錯誤。在你的情況下,我會使用Single()。爲了加快查詢速度,我會考慮在我用作鑑別器的列上添加一個索引。

+0

爲什麼'SingleOrDefault'因爲'Single'在沒有記錄的情況下也會拋出異常?沒有記錄時,SingleOrDefault將返回null。 – 2010-02-12 20:05:33

+0

好吧,Single()實質上斷言只有一條記錄,所以如果其餘的代碼期望這樣,你不必經歷編寫所有空檢查和自己拋出異常的麻煩。 – 2010-02-12 20:19:40

-4

不,它可能會讓您的查詢更慢,因爲可能必須先完成排序。

+2

我不知道它實際上會做什麼,但是如果沒有ORDER BY,爲什麼它必須進行排序? – joeforker 2010-02-12 19:44:30

+0

如果我不使用「ORDER BY」,它仍然會排序嗎? – 2010-02-12 19:45:03

+3

爲什麼簡單地使用TOP 1調用排序? – AnthonyWJones 2010-02-12 19:45:19

0

SingleFirst有不同的用途。

Single是爲你所描述的情況。你總是希望你的代碼「儘早失敗」。

如果你根據你的主鍵或唯一索引查詢,查詢優化器將反正去掉「TOP ... N」的條款。

在其他情況下,TOP 1可能有積極的性能影響,但如果這不完全是你想要做的,不要這樣做。

2

我對SQL Server的使用經驗告訴我,它使您的查詢運行得更快。

2

爲什麼不在列上添加UNIQUE索引?

2

添加一個「TOP」子句可以在某些情況下幫助 - 如果SQL服務器預計查詢可以返回一個非常大的數字的結果,它可以鎖定表中的預期。如果你知道情況並非如此,可以用TOP限制,它不會增加開銷。

+0

+ nolock FTW – 2010-02-12 19:52:41

0

我有超過700萬記錄的表,相對成本昂貴得多,即使一個聚集索引,如果我選擇的所有行,我認爲你的問題可能包括你正在試圖實際的查詢,爲什麼更多信息例如,如果您的表格有700萬行,則完全是另一個故事,從10行的表中返回頂部1與返回全部10行相比,可以忽略不計的性能提升。