我在.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。但是,这更适用于存储过程。
答案 0 :(得分:5)
首先,您需要Person(Name, DateOfBirth)
上的复合索引,而不是两个索引(列可以按任意顺序排列)。
其次,这可能与执行计划有关。
我将建议RECOMPILE
选项:
SELECT p.*
FROM Person p
WHERE Name = @Ian AND DateOfBirth = @DateOfBirth
OPTION (RECOMPILE);
参数化查询可能会发生的情况是执行计划在第一次运行时被缓存 - 但执行计划可能不适合后续调用。
如果这不起作用,则问题可能是数据类型,因为数据类型不兼容可能会阻止索引的使用。确保数据类型和排序规则相同。您可能需要cast()
参数为适当的类型和/或使用COLLATE
。