2013-06-05 67 views
3

當我嘗試運行以下查詢(甚至嘗試獲取預計的執行計劃)時,它非常慢,10+分鐘(我停止等待):檢查varbinary(max)列是否真的很慢

SELECT TOP 1 1 
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0 
    AND Content IS NULL 

但是,下面是即時的:

DECLARE @test varbinary(1) 

SELECT TOP 1 @test = Content 
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0 

IF @test IS NULL 
    PRINT 'a' 

上有一個寫到FileID唯一索引。內容是一個varbinary(max)。爲什麼優化器不首先使用它?那會很邏輯的,不是嗎?它似乎是檢查表中的所有行如果文件內容爲空,然後應用WHERE FileID ='....'

+0

因爲某種原因,您是否可以使用EXISTS,是否是TOP 1?並且內容實際上是否可用?你可以添加查詢計劃。此外,是FileID和FileSize索引? – gbn

+2

什麼版本的SQL?對於更高版本,您可以嘗試使用where語句添加非聚集索引,以便僅索引此列爲null的行。 – Paul

+0

@gbn內容可以爲空。是的,我在「IF EXISTS」中使用這個查詢,速度非常慢。我試圖得到一個查詢計劃..我從來沒有真正等待,直到查詢結束 @Paul這是在SQL Server 2008上。是的,添加索引將是我最後的手段:/它只需要永久鎖定表: ( – Kevin

回答

2

那麼我懷疑,如果你對你的第一個查詢做一個查詢計劃,那麼該計劃將進行表掃描尋找內容= NULL,可能沒有索引?另一方面,第二個查詢只對FileID進行查找,一旦發現它將返回。當然,如果(第一個)FileId ='5021ECD3-2012-62E0-1F12-000041CCB35A'的內容不爲空,那麼第二個查詢將繼續查找,直到表的結尾。在FileID上有唯一的約束嗎?如果沒有,那麼你已經告訴查詢優化器可能是另一行這個文件ID在表中的某處...所以你不能責怪它的外觀。作爲一個著名的探險家離開帳篷時說....我可能需要一段時間....

如果不知道從哪裏查詢計劃則在SSMS,查詢,顯示查詢計劃

HTH

+0

兩者都有相同的執行計劃(除了'CONTENT IS NULL'有一個額外的過濾器外)http://i.imgur.com/nJ7gjXa.png。不同之處在於有時第一個查詢需要25分鐘才能完成(並且我檢查過,它與圖像中的執行計劃相同)。第二個總是很快。 – Kevin

+0

所以你有一個獨特的filedid約束? –

+0

是的,有一個 – Kevin