一個如何優化這個查詢:優化where子句(短路)時,SQL Server 2008
declare @MyParam nvarchar(100) = 25846987;
select top 100 * from MySelectTable
where
(MyParam = @MyParam)
OR
(@MyParam = 0 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random1'))
OR
(@MyParam = 1 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random2'))
OR
(@MyParam = 2 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random3'))
當我只用這部分:
declare @MyParam nvarchar(100) = 25846987;
select top 100 * from MySelectTable
where
(MyParam = @MyParam)
它返回1秒。
使用所有參數時,大約需要5分鐘。
我相信這是因爲它只是在匹配MyParam = @MyParam時掃描一個MassiveSlowTable。
如果@MyParam匹配MyParam,我該如何跳過所有其他比較?我嘗試使用CASE語句,但它們不適用於IN子句。我嘗試重新排列並列中的AND,甚至在aMassiveSlowTable中添加額外的過濾。
如果@MyParam與MyParam不匹配,則查詢花費一點時間就可以。
有表現不佳:可以查看以下KB:
FIX *否*保證SQL Server將評估單個查詢的部分的順序(例如,它可能會計算SELECT'子句的一個計算結果,該計算結果可能會被'WHERE'子句排除)。 –
@Damien我開始這麼想。 –
你可以發表兩個表的定義,指數和執行計劃嗎? –