我正在查看遺留代碼,因爲它的性能很差。 我跟蹤這個問題到當使用OR @Parameter IS NULL與函數時出現奇怪的性能問題
DECLARE @Parameter AS VARCHAR(50) = '12345'
SELECT *
FROM MyTable
WHERE
(
MyIndexedField IN (SELECT Value from fn_Function(@Parameter))
OR @Parameter ISNULL;
)
AND OtherCriteria = 'Something'
查詢是想從表中拉,有一個非聚集索引的字段的所有數據。當我刪除OR @Parameter IS NULL它運行在一秒鐘之內,但是當我添加@Parameter IS NULL時,它需要40s +。
如果我用函數替換函數,它會在一秒之內運行。 例
SELECT *
FROM MyTable
WHERE
(
MyIndexedField IN ( '12345')
OR @Parameter ISNULL;
)
AND OtherCriteria = 'Something'
任何想法怎麼回事,和一個更好的方式來重寫此查詢?
這是對正在運行的SQL 2008
感謝,
編輯
我是能夠得到解決的問題,但溶液奇,見下文。 不要以爲這是最好的解決方案,如果您有任何建議,將不勝感激。
DECLARE @Parameter AS VARCHAR(50) = '12345'
SELECT DISTINCT MyIndexedField
INTO #T
FROM MyTable WHERE @Parameter IS NULL
UNION ALL
SELECT Value FROM fn_Function(@Parameter)
SELECT *
FROM MyTable AS X
JOIN #T AS T ON T.MyIndexedField = X.MyIndexedField
WHERE OtherCriteria = 'Something'