當我嘗試運行以下查詢(甚至嘗試獲取預計的執行計劃)時,它非常慢,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 ='....'
因爲某種原因,您是否可以使用EXISTS,是否是TOP 1?並且內容實際上是否可用?你可以添加查詢計劃。此外,是FileID和FileSize索引? – gbn
什麼版本的SQL?對於更高版本,您可以嘗試使用where語句添加非聚集索引,以便僅索引此列爲null的行。 – Paul
@gbn內容可以爲空。是的,我在「IF EXISTS」中使用這個查詢,速度非常慢。我試圖得到一個查詢計劃..我從來沒有真正等待,直到查詢結束 @Paul這是在SQL Server 2008上。是的,添加索引將是我最後的手段:/它只需要永久鎖定表: ( – Kevin