sql-server – SQL Server查询:快速文字但缓慢与变量

我有一个视图,使用CTE从表中返回2个int。如果我查询这样的视图,它运行不到一秒钟

SELECT * FROM view1 WHERE ID = 1

但是,如果我查询这样的视图需要4秒。

DECLARE @id INT = 1
SELECT * FROM View1 WHERE ID = @id

我检查了2个查询计划,第一个查询正在主表上执行一个聚簇索引搜索,返回1个记录,然后将其余视图查询应用于该结果集,其中第二个查询执行索引扫描,返回大约3000个记录记录,而不仅仅是我感兴趣的记录,然后过滤结果集。

有没有什么明显的,我没有尝试获得第二个查询使用索引搜索,而不是索引扫描。我正在使用SQL 2008,但我所需要的任何事情也需要在SQL 2005上运行。起初我以为这是某种参数嗅探问题,但即使我清除缓存,我得到相同的结果。

可能是因为在参数的情况下,优化器不能知道该值不为空,所以它需要创建一个返回正确结果的计划,即使是这样。如果您有SQL Server 2008 SP1,可以尝试向查询添加OPTION(RECOMPILE)。
翻译自:https://stackoverflow.com/questions/4459425/sql-server-query-fast-with-literal-but-slow-with-variable

转载注明原文:sql-server – SQL Server查询:快速文字但缓慢与变量