SQL Server参数使动态查询变慢

时间:2015-09-02 17:23:01

标签: sql-server performance dynamic parameters

我遇到了一个由传递给动态SQL的参数引起的奇怪问题。

动态SQL有完整的参数,如下所示:

SET @sql = @sql + N'AND (Book.ID = @paramBookID) ' 
IF (NOT @AuthorID IS NULL) 
    SET @sql = @sql + N'AND (Book.AuthorID = @paramAuthorID) ' 

然后我将参数传递给sp_executeSql调用,如下所示:

-- Execute the parameterized dynamic SQL query
DECLARE @params NVARCHAR(500) = N'@paramBookID int, @paramAuthorID int'

EXEC sp_executesql @sql, @params,
    @paramBookID = @BookID,
    @paramAuthorID = @AuthorID

动态查询非常慢,起初我认为是导致问题的动态SQL执行,所以我创建了动态SQL并将其复制到SSMS。 然后我在查询的顶部声明了所有变量并且执行得更快(大约一秒钟,而不是1分钟以上) 然后我做了一些更多的摆弄,并替换了一个变量实际值变量的行:

替换:AND(Book.AuthorID = @paramAuthorID)

使用:AND(Book.AuthorID = 1471409)

查询开始再次运行缓慢。 不知道为什么这会导致问题并使查询运行得如此之慢。 我甚至试过这个:

AND(Book.AuthorID = CAST(1471409 AS INT))

因为我觉得这可能是某种打字问题,但这也没有帮助,它仍然运行缓慢, 所以最后我最终对动态sql进行了一些修改,将所有参数复制到动态SQL中的局部变量中:

SET @sql = 
    N'DECLARE @BookId INT = @paramBookID ' +
    N'DECLARE @AuthorID INT = @paramAuthorID ' +
    @sql

查询现在运行速度更快,我仍然没有解释为什么。 有没有人对我偶然发现的这个奇怪的解决方案有任何见解?

0 个答案:

没有答案