Sql-Server

如果查詢觸發了統計資訊更新並超時,統計資訊是否仍會更新?

  • December 7, 2011

我有一個全文查詢,它通常非常快,但是當它導致統計資訊更新時可能會超時,因為該數據庫上的統計資訊更新非常慢。通常,在更新統計資訊後查詢會“恢復”到正常速度,但我看到查詢總是超時的情況,我只能用統計資訊從未更新(或者我認為)這一事實來解釋。

不幸的是,此時我無法重現該問題,因為我們將統計資訊更新切換為“非同步自動更新統計資訊”以防止發生超時(稍微過時的統計資訊對我們來說不是問題)。

所以我的問題是

如果將統計資訊更新設置為(預設)同步統計資訊更新(非同步自動更新統計資訊 = 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   

以及下面的測試程式碼

        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();

Profiler 顯示以下內容

個人資料截圖

首先,它成功創建列的統計資訊b(初始SP:StmtStarting/SP:StmtCompleted對)。然後它開始為列創建統計資訊a(螢幕截圖中的選定SP:StmtStarting條目)。此條目後跟一個AUTOSTATS事件,確認b已創建統計資訊,然後超時開始。

可以看出,stats 創建發生在與查詢相同的 spid 上,因此這也中止了 column 上的 stats 創建a。在該過程結束時,表上僅存在一組統計資訊。

編輯

以上是指統計資訊的創建,為了測試統計資訊的自動更新,我在沒有超時的情況下執行了上述查詢,因此成功創建了兩組統計資訊,然後更新了所有行的所有列,以便統計資訊過期並重新執行考試。跟踪非常相似

探查器 2

最後只是為了完整SET AUTO_UPDATE_STATISTICS_ASYNC ON的跟踪看起來如下。可以看出,系統 spid 用於執行操作,並且它們不受預期的查詢超時的影響。

探查器 3

引用自:https://dba.stackexchange.com/questions/8908