gpt4 book ai didi

sql-server - SQL Server 2008R2 中 "SET STATISTICS TIME ON"的奇怪副作用?

转载 作者:行者123 更新时间:2023-12-02 21:12:26 24 4
gpt4 key购买 nike

SET STATISTICS TIME OFF;

DECLARE @String AS VARCHAR(10), @I INT = 1

WHILE @I <= 3
BEGIN
SET @String = CASE @I WHEN 1 THEN 'First' WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' END;

SELECT @String AS [StatsTimeOff] OPTION(RECOMPILE)

SET STATISTICS TIME ON

SELECT @String AS [StatsTimeOn] OPTION(RECOMPILE)

SET STATISTICS TIME OFF

SET @I +=1;
END

返回

StatsTimeOff
------------
First

StatsTimeOn
-----------
First


StatsTimeOff
------------
Second

StatsTimeOn
-----------
First


StatsTimeOff
------------
Third

StatsTimeOn
-----------
First

为什么OPTION(RECOMPILE)SET STATISTICS TIME ON的组合显然会使变量回归到其初始值?

我以前从未见过SET STATISTICS TIME ON 对结果有影响。
我在这里错过了什么吗?

最佳答案

这确实是一个错误,我可以在 SQL 2008 R2 SP2 中重现该错误。我相信您的案例陈述有点不同,因为您只需选择 @I 即可重现该问题,我将按如下方式重写它:

DECLARE @I INT = 1   

WHILE @I <= 3
BEGIN
SELECT FirstRun = @I OPTION(RECOMPILE)

SET STATISTICS TIME ON

SELECT SecondRun = @I OPTION(RECOMPILE)

SELECT ThirdRun = @I OPTION(RECOMPILE)

SET @I +=1
END

由于我相信这是一个错误,因此我不会尝试修复它。不过,我建议将所有 SSMS 设置移至批处理的开头,并以这种方式运行。此解决方法可以避免该问题。

我的猜测是,当选项更改时,它会返回整个查询以尝试找出如何制定执行计划,并且当它这样做时,它会(错误地)获取变量的初始值。由于它使用 OPTION(RECOMPILE),该参数作为常量放入计划中,这就是为什么您仅在使用该选项时看到此错误。

如果您立即再次运行该 select 语句,它就会开始返回正确的值,这很奇怪。这是我没想到的,它为您提供了另一种解决方法,允许您打开统计信息并在其之后运行其他操作,例如,奇怪的是,SET STATISTICS IO ON。

关于sql-server - SQL Server 2008R2 中 "SET STATISTICS TIME ON"的奇怪副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20969355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com