0

全部,

当我在性能方面运行查询时,我看到了一些非常奇怪的行为,即在使用开始时设置的变量与实际使用该值作为查询中的常量之间。

我看到的是

DECLARE @ID BIGINT
SET @ID = 5
SELECT * FROM tblEmployee WHERE ID = @ID

跑得比我跑时快得多

SELECT * FROM tblEmployee WHERE ID = 5

这显然是实际查询的一个更简单的版本,但有谁知道 SQL Server 2005 中的已知问题,它解析可以解释这种行为的查询的方式。我的原始查询在两种方法之间从 13 秒到 8 分钟。

谢谢,阿希什

4

4 回答 4

1

您是否检查了每个查询计划?当我试图分析性能问题时,这始终是我做的第一件事。

于 2010-11-05T16:53:17.613 回答
1

你确定是这样吗?

通常参数化查询会比较慢,因为 SQL Server 事先不知道参数是什么。可以立即优化常数。

关于数据类型需要注意的一件事..这是做什么的:

SELECT * FROM tblEmployee WHERE ID = CAST(5 as bigint)

另外,颠倒执行顺序。前几天我们看到了一些奇怪的东西,当我们改变订单时,计划也发生了变化。

另一种方式是,掩码 ID 删除“参数嗅探”对第一个查询的影响。和区别?

DECLARE @ID BIGINT
SET @ID = 5
DECLARE @MaskedID BIGINT
SET @MaskedID = @ID
SELECT * FROM tblEmployee WHERE ID = @MaskedID 

最后,将 OPTION (RECOMPILE) 添加到每个查询。这意味着该计划被丢弃而不是重新使用,因此它的编译方式不同。

于 2010-11-05T16:20:13.483 回答
0

如果值被缓存,您可能会得出一个毫无根据的结论,即一种方法比另一种方法更快。总是有这个区别吗?

于 2010-11-05T16:05:29.077 回答
0

据我了解,这与缓存查询计划有关。

当您运行 Select * from A Where B = @C 时,无论@C 的值如何,它都是一个查询计划。因此,如果您使用不同的 @C 值运行 10 次,则它是一个单一的查询计划。

当你运行时:

Select * from A Where B = 1 it creates a query plan
Select * from A Where B = 2 creates another
Select * from A Where B = 3 creates another

等等

所有这些都会消耗内存。

谷歌查询计划缓存和文字,我相信你会找到详细的解释

于 2013-07-26T18:27:04.897 回答