如果查詢觸發了統計資訊更新並超時,統計資訊是否仍會更新?
我有一個全文查詢,它通常非常快,但是當它導致統計資訊更新時可能會超時,因為該數據庫上的統計資訊更新非常慢。通常,在更新統計資訊後查詢會“恢復”到正常速度,但我看到查詢總是超時的情況,我只能用統計資訊從未更新(或者我認為)這一事實來解釋。
不幸的是,此時我無法重現該問題,因為我們將統計資訊更新切換為“非同步自動更新統計資訊”以防止發生超時(稍微過時的統計資訊對我們來說不是問題)。
所以我的問題是
如果將統計資訊更新設置為(預設)同步統計資訊更新(非同步自動更新統計資訊 = 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
。在該過程結束時,表上僅存在一組統計資訊。編輯
以上是指統計資訊的創建,為了測試統計資訊的自動更新,我在沒有超時的情況下執行了上述查詢,因此成功創建了兩組統計資訊,然後更新了所有行的所有列,以便統計資訊過期並重新執行考試。跟踪非常相似
最後只是為了完整
SET AUTO_UPDATE_STATISTICS_ASYNC ON
的跟踪看起來如下。可以看出,系統 spid 用於執行操作,並且它們不受預期的查詢超時的影響。