當數據庫設置為自動更新統計后,SQL Server 監控表中的數據更改,當更改滿足一下條件之一時更新:
1.向空表插入數據時
2.少於500行的表增加500行或者更多
3.當表中行多於500行時,數據的變化量大於20%時
(在SQL SERVER 2000中,指的是20%的行被修改,而在SQL SERVER 2005/2008中,指的是20%的列數據被修改)
可以手動使用UPDATE STATISTICS 或EXEC sys.sp_updatestats來更新統計
UPDATE STATISTICS 需要鎖表
UPDATE STATISTICS table_or_indexed_view_name
[
{
{ index_or_statistics__name }
| ( { index_or_statistics_name } [ ,...n ] )
}
]
[ WITH
[
FULLSCAN
| SAMPLE number { PERCENT | ROWS }
| RESAMPLE
| <update_stats_stream_option> [ ,...n ]
]
[ [ , ] [ ALL | COLUMNS | INDEX ]
[ [ , ] NORECOMPUTE ]
] ;
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_contant ]
table_or_indexed_view_name
要更新其統計信息的表或索引視圖的名稱。
index_or_statistics_name
要更新其統計信息的索引的名稱,或要更新的統計信息的名稱。如果不指定 index_or_statistics_name,則查詢優化器將更新表或索引視圖的所有統計信息。 這包括使用 CREATE STATISTICS 語句創建的統計信息、在
AUTO_CREATE_STATISTICS 為 ON 時創建的單列統計信息以及為索引創建的統計信息。
有關 AUTO_CREATE_STATISTICS 的詳細信息,請參閱 ALTER DATABASE SET
選項 (Transact-SQL)。若要查看某一表或視圖的所有索引,您可以使用 sp_helpindex。
FULLSCAN
通過掃描表或索引視圖中的所有行來計算統計信息。FULLSCAN 和 SAMPLE 100 PERCENT
的結果相同。 FULLSCAN 不能與 SAMPLE
選項一起使用。
SAMPLE number { PERCENT | ROWS }
指定當查詢優化器更新統計信息時要為其使用的表或索引視圖中近似的百分比或行數。對於 PERCENT,number 可以介於 0 到 100 之間;對於 ROWS,number 可以介於 0
到總數行之間。 查詢優化器抽樣的實際行百分比或行數可能與指定的行百分比或行數不匹配。 例如,查詢優化器掃描數據頁上的所有行。 對於基於默認抽樣的查詢計划並非最佳的特殊情況,SAMPLE 非常有用。在大多數情況下,不必指定
SAMPLE,這是因為在默認情況下,查詢優化器根據需要采用抽樣,並以統計方式確定大量樣本的大小,以便創建高質量的查詢計划。
SAMPLE 不能與 FULLSCAN 選項一起使用。如果未指定 SAMPLE 和 FULLSCAN,查詢優化器則默認使用抽樣數據並計算樣本大小。
我們建議不指定 0 PERCENT 或 0 ROWS。如果指定 0 PERCENT 或 0 ROWS,則將更新統計信息對象,但該對象不包含任何統計信息數據。
RESAMPLE
使用最近的采樣速率更新每個統計信息。
使用 RESAMPLE 會導致全表掃描。例如,索引的統計信息使用全表掃描來獲取其采樣速率。 如果未指定采樣選項(SAMPLE、FULLSCAN、RESAMPLE),則查詢優化器默認將對數據進行抽樣並計算樣本大小。
ALL | COLUMNS | INDEX
更新所有現有統計信息、在一列或多列上創建的統計信息或為索引創建的統計信息。如果未指定上述任何選項,則 UPDATE STATISTICS
語句將更新表或索引視圖上的所有統計信息。
NORECOMPUTE
為指定統計信息禁用自動統計信息更新選項
AUTO_UPDATE_STATISTICS。如果指定此選項,則查詢優化器將完成此統計信息更新並禁用將來的更新。
若要重新啟用 AUTO_UPDATE_STATISTICS 選項行為,請不使用
NORECOMPUTE 選項再次運行 UPDATE STATISTICS,或運行 sp_autostats。
--================================================================
同事扔過一條SQL,跟我說生產服務器上執行得好好的,測試環境很慢,問我是不是有阻塞,執行一看,的確很慢,一分鍾還沒有結束,運行查看阻塞的語句,發現沒有阻塞,但是邏輯讀特別高,使用SET STATISTICS IO ON,發現邏輯讀集中某兩張表上,查看實際執行計划,發現預估執行次數和實際執行次數相差上萬倍,於是毫不猶豫執行EXEC sys.sp_updatestats,更新統計結束后,原來執行超過1分鍾的查詢不到1秒結束
看來定期更新統計還是很有必要的。