當數據庫設置為自動更新統計后,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秒結束
看來定期更新統計還是很有必要的。
新聞熱點
疑難解答