【发布时间】:2009-02-04 05:51:02
【问题描述】:
在一个 SQL Server 2005 数据库中,我正在处理这个查询:
选择 *
来自 foo
加入 bar.x = foo.x
在 baz.y 上加入 baz = foo.y
其中 foo.x = 1000
与以下参数化版本相比,查询计划大不相同且速度更快。
声明@p0 int
设置@p0 = 1000
选择 *
来自 foo
加入 bar.x = foo.x
在 baz.y 上加入 baz = foo.y
其中 foo.x = @p0
在我的特殊情况下,带有文字的版本在亚秒时间内运行。参数化版本需要 2-3 秒。我希望它们是相同的,因为它们是相同的查询。
为什么他们得到不同的查询计划?
有什么办法可以让参数化版本和字面量版本的性能一样?
这里是查询计划。我的真实查询与我上面给出的通用查询有很大不同,但是产生这些计划的两个查询之间的唯一区别是参数。为什么用参数替换文字会导致如此截然不同的计划?
【问题讨论】:
-
您检查过实际的执行计划吗? (在 Management Studio 中使用“包含实际执行计划”)
-
是的,它们完全不同。
-
你会包括执行计划吗?他们可能会指出问题所在。
-
这是另一个解决方案,适用于使用案例阻止他们实施下面列出的任何其他解决方案的任何人。我最终运行了两个查询——第一个保持参数化,但 only 返回唯一键(在我的例子中,一个名为 CTID 的列)。我的第二个查询是非参数化的,只是查询了同一个表 WHERE CTID IN(我之前提取的 CTID 列表转到此处)。根据您的情况,这可能不是解决方案,但它有效地规避了 SQL 与参数有关的问题,并将我非常大的查询从 19 秒移至 2.5 秒。
标签: sql-server