我有一个全文查询,它通常非常快,但当它导致统计数据更新时可能会超时,因为该数据库上的统计数据更新非常慢。通常情况下,在统计数据更新后,查询“恢复”到正常速度,但我看到了查询总是超时的情况,我只能用统计数据从未更新这一事实来解释(至少我认为是这样)。
不幸的是,我现在无法重现这个问题,因为我们将统计信息异步更新到“自动更新统计”,以防止超时的发生(稍微过时的统计数据对我们来说不是问题)。
所以我的问题是
我找到了一个其他国家引用--如果是这样的话,我无法解释连续超时查询的情况。
发布于 2011-12-07 11:21:47
这其实是我在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 和下面的测试代码
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用于执行操作,它们不受预期的查询超时的影响。

发布于 2011-12-07 09:32:35
据我所知,如果缺少查询,可以通过查询来创建统计信息,但只有在需要时才会更新统计数据(表中数据修改的某些百分比),当这些数据被设置为autoupdate时才会更新。因此,无法保证统计数据得到更新。
https://dba.stackexchange.com/questions/8908
复制相似问题