2012-03-13 23 views
8

在查詢中使用SQL Server TOP子句時,一旦SQL Server引擎足夠滿足需要返回的TOP X,SQL Server引擎是否停止搜索行?一旦SQL Server TOP找到足夠的行,它會停止處理嗎?

考慮下面的查詢(假設some_text_field是獨一無二的,沒有設置全文索引):

SELECT 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

SELECT TOP 1 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

第一個查詢將需要搜索整個表並返回它找到的所有結果。我們設置它的方式,該查詢將真正返回一個值。那麼,使用TOP 1是否會阻止SQL Server在找到匹配項後掃描表的其餘部分?

+1

是的,它在第一次比賽後停止。 – MicSim 2012-03-13 16:59:50

+6

如果您使用'TOP x' **而沒有**提供'ORDER BY',結果將是隨機且不可預測的。因此,由於您應該爲查詢提供一個ORDER BY,所以您需要爲查詢處理器提供適當的索引,以便能夠按順序獲取前n行並在此之後停止 - 否則需要對整個表格進行掃描和排序。 – 2012-03-13 17:01:30

+0

@marc_s您的評論是最佳答案。 :) – 2012-03-13 17:03:59

回答

6

是的,查詢一旦找到足夠的行就停止,並且不查詢其餘的表。

但是請注意,您可能希望有一個數據庫可用於查詢的索引。在這種情況下,獲得第一場比賽和獲得所有比賽之間沒有任何性能差異。

+0

馬丁史密斯的回答是一個很好的答案,但是這個與我的需求更相關。我正在研究舊版/舊版軟件,而且沒有人經歷並且幾乎沒有任何索引,所以我們正在做類似這樣的事情,最終執行整個表掃描以找到一行數據...... – jzimmerman2011 2012-03-22 17:01:29

5

是的。

在這種情況下,你會得到1個未定義行(如TOP沒有ORDER BY不保證任何特定結果),那麼它會停止處理(在計劃不會從孩子迭代器要求任何更多的行的TOP迭代器)。

如果有阻塞操作(如SORT)在計劃中TOP可能最終做的最終結果沒有返回反正雖然行了很多工作前TOP運營商或運營商平行之前。