Bro*_*ass 5 sql-server-2005 sql-server statistics
我有一个全文查询,它通常非常快,但当它导致统计更新时可能会超时,因为该数据库上的统计更新非常慢。通常,在更新统计信息后,查询会“恢复”到正常速度,但我见过查询总是超时的情况,我只能用统计信息从未更新的事实来解释(或者我认为是这样)。
不幸的是,我此时无法重现该问题,因为我们将统计更新切换为“异步自动更新统计”以防止超时发生(稍微过时的统计信息对我们来说不是问题)。
所以我的问题是
如果将统计更新设置为(默认)同步统计更新(异步自动更新统计 = false),是否可以保证在超时的查询上更新统计信息?
我发现了一个引用,否则说明- 如果是这种情况,我无法解释持续超时查询的情况。
这实际上是我在 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
对)。然后它开始为列创建统计信息a
(SP:StmtStarting
屏幕截图中的选定条目)。此条目之后是一个AUTOSTATS
事件,确认b
已创建统计信息,然后超时开始。
可以看出,统计信息的创建发生在与查询相同的 spid 上,因此这也会中止列上的统计信息的创建a
。在流程结束时,表格中只存在一组统计信息。
编辑
以上指的是统计信息的创建,为了测试统计信息的自动更新,我在没有超时的情况下运行了上述查询,因此成功创建了两组统计信息,然后更新了所有行的所有列,以便统计信息过时并重新运行考试。跟踪非常相似
最后只是为了完整性,SET AUTO_UPDATE_STATISTICS_ASYNC ON
跟踪如下所示。可以看出,系统 spid 用于执行操作,它们不受查询超时的影响,正如预期的那样。
归档时间: |
|
查看次数: |
904 次 |
最近记录: |