参数化查询太慢了

时间:2016-04-15 13:38:01

标签: sql sql-server

我在.NET中有一个复杂的查询。请参阅下面的查询(简单查询以解释说明):

SELECT * FROM Person WHERE Name='Ian' AND DateOfBirth='1961-04-04'

和此:

SELECT * FROM Person WHERE Name=@Ian AND DateOfBirth=@DateOfBirth

该表已编入索引(姓名和出生日期)。

第一个查询需要几分之一秒才能从.NET运行。第二个查询大约需要48秒。这与执行计划有关吗?有什么办法可以强制SQL Server重新创建执行计划吗?

我见过这个问题:https://dba.stackexchange.com/questions/530/how-do-you-clear-out-all-old-query-plans-from-within-microsoft-sql-server。但是,这更适用于存储过程。

1 个答案:

答案 0 :(得分:5)

首先,您需要Person(Name, DateOfBirth)上的复合索引,而不是两个索引(列可以按任意顺序排列)。

其次,这可能与执行计划有关。

我将建议RECOMPILE选项:

SELECT p.*
FROM Person p
WHERE Name = @Ian AND DateOfBirth = @DateOfBirth
OPTION (RECOMPILE);

参数化查询可能会发生的情况是执行计划在第一次运行时被缓存 - 但执行计划可能不适合后续调用。

如果这不起作用,则问题可能是数据类型,因为数据类型不兼容可能会阻止索引的使用。确保数据类型排序规则相同。您可能需要cast()参数为适当的类型和/或使用COLLATE