首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果查询触发统计更新并超时,统计信息是否仍然更新?

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

Database Administration用户
提问于 2011-12-07 03:26:52
回答 2查看 1K关注 0票数 5

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

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

所以我的问题是

是否保证在查询中更新统计信息,以便将统计信息更新设置为(默认)同步统计信息更新(自动更新统计信息异步=假)?

我找到了一个其他国家引用--如果是这样的话,我无法解释连续超时查询的情况。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2011-12-07 11:21:47

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

使用下面的测试表

代码语言:javascript
复制
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   

和下面的测试代码

代码语言:javascript
复制
         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();

分析器显示如下

首先,它成功地为列b创建了统计数据(初始的SP:StmtStarting /SP:StmtCompleted对)。然后,它开始为列a (屏幕快照中选定的SP:StmtStarting条目)创建统计信息。这个条目后面是一个AUTOSTATS事件,确认b上的统计信息是创建的,然后超时就开始了。

可以看到,统计数据的创建与查询发生在同一个spid上,因此这也中止了在列a上创建统计信息。在处理结束时,表上只存在一组统计数据。

编辑

上面提到了stats创建,为了测试我在没有超时的情况下运行了上述查询的统计数据的自动更新,所以成功地创建了这两组统计数据,然后更新了所有行的所有列,这样统计数据就过时了,并重新运行测试。它的跟踪非常相似。

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

票数 7
EN

Database Administration用户

发布于 2011-12-07 09:32:35

据我所知,如果缺少查询,可以通过查询来创建统计信息,但只有在需要时才会更新统计数据(表中数据修改的某些百分比),当这些数据被设置为autoupdate时才会更新。因此,无法保证统计数据得到更新。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/8908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档