如果查询触发统计信息更新并且超时,统计信息是否仍会更新?

Bro*_*ass 5 sql-server-2005 sql-server statistics

我有一个全文查询,它通常非常快,但当它导致统计更新时可能会超时,因为该数据库上的统计更新非常慢。通常,在更新统计信息后,查询会“恢复”到正常速度,但我见过查询总是超时的情况,我只能用统计信息从未更新的事实来解释(或者我认为是这样)。

不幸的是,我此时无法重现该问题,因为我们将统计更新切换为“异步自动更新统计”以防止超时发生(稍微过时的统计信息对我们来说不是问题)。

所以我的问题是

如果将统计更新设置为(默认)同步统计更新(异步自动更新统计 = false),是否可以保证在超时的查询上更新统计信息?

我发现了一个引用,否则说明- 如果是这种情况,我无法解释持续超时查询的情况。

Mar*_*ith 7

这实际上是我在 AskSSC 的问题。我应该自己测试一下,因为我接受了错误的答案。

用下面的测试表

CREATE TABLE StatsTest
(
a varchar(max),
b varchar(max)
)

DECLARE @VCM VARCHAR(MAX) = 'A'

INSERT INTO StatsTest
SELECT TOP 20000
       REPLICATE(@VCM,10000),
       REPLICATE(@VCM,10000)
FROM master..spt_values v1,  master..spt_values v2   
Run Code Online (Sandbox Code Playgroud)

以及以下测试代码

         SqlConnection connection = new SqlConnection(...);
            connection.Open();

            SqlCommand command = connection.CreateCommand();
            command.CommandTimeout = 12;
            command.CommandType = CommandType.Text;
            command.CommandText = @"SELECT COUNT(*)
FROM StatsTest
WHERE 
      a LIKE '%foo%' OR 
      b LIKE '%foo%' ";
            command.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

Profiler 显示以下内容

探查器屏幕截图

首先,它b成功创建列的统计信息(初始SP:StmtStarting/SP:StmtCompleted对)。然后它开始为列创建统计信息aSP:StmtStarting屏幕截图中的选定条目)。此条目之后是一个AUTOSTATS事件,确认b已创建统计信息,然后超时开始。

可以看出,统计信息的创建发生在与查询相同的 spid 上,因此这也会中止列上的统计信息的创建a。在流程结束时,表格中只存在一组统计信息。

编辑

以上指的是统计信息的创建,为了测试统计信息的自动更新,我在没有超时的情况下运行了上述查询,因此成功创建了两组统计信息,然后更新了所有行的所有列,以便统计信息过时并重新运行考试。跟踪非常相似

探查器 2

最后只是为了完整性,SET AUTO_UPDATE_STATISTICS_ASYNC ON跟踪如下所示。可以看出,系统 spid 用于执行操作,它们不受查询超时的影响,正如预期的那样。

探查器 3