我在我的Microsoft SQL Server(2012年快遞)數據庫運行下面的SQL查詢,並能正常工作,在不到一秒鐘的執行:簡單的變化會導致SQL查詢執行時間大幅增加
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
)
GROUP BY StringValue
我在內部查詢中添加一個過濾器,它會繼續正常工作,返回的結果稍微少一些(如預期的那樣),並且在不到一秒的時間內執行。
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
AND ID IN (
SELECT A2.ProductAssociation
FROM Attributes A2
WHERE A2.Name = 'Is test' AND A2.BooleanValue = 0
)
)
GROUP BY StringValue
但是當我添加一個標誌變量,使我在內部查詢到「開啓/關閉」過濾器,標誌設置爲零,查詢似乎會無限期地執行(我離開運行約5分鐘後強制取消):
DECLARE @IsTestsIncluded bit
SET @IsTestsIncluded = 0
SELECT
StringValue, COUNT(StringValue)
FROM Attributes
WHERE
Name = 'Windows OS Version'
AND StringValue IS NOT NULL
AND ProductAssociation IN (
SELECT ID
FROM ProductAssociations
WHERE ProductCode = 'MyProductCode'
AND (
@IsTestsIncluded = 1
OR
ID IN (
SELECT A2.ProductAssociation
FROM Attributes A2
WHERE A2.Name = 'Is test' AND A2.BooleanValue = 0
)
)
)
GROUP BY StringValue
爲什麼?我究竟做錯了什麼?我發誓我過去沒有使用過這種模式。
(當我設置@IsTestsIncluded = 1
在最終查詢的上方,過濾器被跳過,並且執行時間是正常的 - 延遲只發生時@IsTestsIncluded = 0
)
EDIT
作爲每Joel的請求在的意見,這裏是第一個查詢的執行計劃:
這裏是第二查詢執行計劃:
(我不能發佈一個執行計劃,因爲它永遠不會完成第三查詢 - 除非有另一種方式得到它在SSMS? )
這是無法回答的,直到你還發布執行計劃(有投票關閉,抱歉) ,但是**猜測**(因此評論而不是答案)是'OR'條件的加入破壞了服務器可靠地使用過濾器索引的能力。 –
此外,不是在'IN'子句中嵌套'SELECT',而是通過在子查詢上將它重寫爲'JOIN',幾乎可以做得更好。 –
我按照你的建議(在第一個子查詢上)使用JOIN,但結果仍然相同。將發佈執行計劃。 – Ross