天天看點

性能優化——統計資訊——SQLServer自動更新和自動建立統計資訊選項AUTO_CREATE_STATISTICS選項:Auto Update Statistics選項:如何關閉SQLServer自動更新統計資訊的選項?何時建立統計資訊?何時更新統計資訊?

        統計資訊是如何提高SQLServer查詢性能的?統計直方圖用作在查詢執行計劃中查詢優化器的選擇依據。如果一個查詢謂詞包含統計資訊的列,那麼查詢優化器不需要預測該查詢中影響行數,是以,查詢優化器有足夠的資訊去建立執行計劃。SQLServer建立執行計劃有一下幾種不同的方式:

統計資訊會在每個新建立的索引中自動建立統計資訊。

如果資料庫中AUTO_CREATE_STATISTICS被設定為ON,SQLServer将會自動對查詢中用到的,且沒有索引的列自動建立統計資訊。

當把該選項設為ON時,查詢優化器會對在謂詞中使用的到列,如果這些列的統計資訊不可用,則會單獨對每列建立統計資訊。這些統計資訊對建立一個查詢計劃非常必要。它們建立于那些現有統計對象中不存在直方圖的列上,名字包括列名和對象ID的十六進制格式:_WA_Sys_<column_name>_<XXXX>。這些統計資訊用于查詢優化器決定使用何種優化後的執行計劃。

可以通過以下語句啟用自動統計資訊建立功能:

ALTER  DATABASE[你的庫名]

SET AUTO_CREATE_STATISTICS ON

         統計資訊會在查詢編譯或者執行緩存執行計劃前被檢查。當在以下情況下,統計資訊會被認為過期:

1、  在一個空表中有資料的改動。

2、  當統計資訊建立時,表的行數隻有500或以下,且後來統計對象中的引導列的更改次數大于500.

3、  當表的統計資訊收集時,超過了500行,且統計對象的引導列後來更改次數超過500+表總行數的20%時。

4、  在Tempdb中的表,少于6行且最少有6行被更改。

可以使用一下語句來開啟自動更新統計資訊:

SET AUTO_UPDATE_STATISTICS ON

過時的統計資訊會引起大量的性能問題,是以建議開啟自動更新。它的預設設定是ON。沒有更新統計資訊常見的影響是選擇了次優的執行計劃,然後性能下降。有時候,過期的統計資訊可能比沒有統計資訊更加糟糕。

使用以下語句來開啟異步更新統計資訊:

SET AUTO_UPDATE_STATISTICS_ASYNC ON

如果開啟了這個選項,查詢優化器将先執行一次查詢,然後更新過期的統計資訊。當你把這個選項設為OFF時,查詢優化器将在編譯查詢之前更新過期統計資訊。這個選項在OLTP環境下很有用,但在資料倉庫中有負面影響。

         在非常特殊的情況下,你不得不禁用這個有用的特性,可以使用以下方式關閉:

1、  使用sp_autostats來在表、索引或者統計對象上顯式并更改自動更新統計資訊選項。

2、  在表級别中,可以使用NORECOMPUTEoption of the UPDATE STATISTICS指令。

3、  你也可以在CREATESTATISTICS指令中使用NORECOMPUTE選項,但之後需要删除并重建統計資訊。

4、  在CREATE INDEX指令中使用STATISTICS_NORECOMPUTE。

5、  在資料庫級别,可以使用以下指令來禁用:

ALTER DATABASE[你的庫名]

SET AUTO_UPDATE_STATISTICS OFF

當使用資料庫級别的禁用時,表、索引或者統計對象的設定将全部失效。

         其中一個答案是當使用資料庫引擎優化顧問(DTA)時建議建立。另外一個情況是當你檢視執行計劃是,出現丢失統計資訊的警告(missing statistics warnings),如下圖的黃色三角歎号:

性能優化——統計資訊——SQLServer自動更新和自動建立統計資訊選項AUTO_CREATE_STATISTICS選項:Auto Update Statistics選項:如何關閉SQLServer自動更新統計資訊的選項?何時建立統計資訊?何時更新統計資訊?

可以使用SQLServer Profiler 去監控丢失列統計資訊的事件,你也可以考慮當你的查詢從子集或者查詢謂詞中包含關聯列的那些列上建立統計資訊。

建立統計資訊的語句如下:

--Create statistics on all rows

CREATE STATISTICSstatistics_name   ONYourDBName.YourSchema.YourTable(YourColumn1,YourColumn2)  

WITH FULLSCAN

 --Create statistics using a random 10 percent sampling rate

CREATE STATISTICSstatistics_name   ONYourDBName.YourSchema.YourTable(YourColumn1,YourColumn2)   

WITH SAMPLE 10PERCENT

         如果你的查詢執行得很慢,那麼是時候更新統計資訊了。并且建議當你插入大量資料到升序或者降序的列時,更新統計資訊,因為在這種情況下,統計資訊直方圖将不包含新插入的值,同時,強烈建議在除索引維護(當你重建、整理碎片或者重組索引時,資料分布不會改變)外的維護工作之後更新統計資訊。

         如果資料庫的資料更改頻繁,建議最低限度每天更新一次統計資訊。一般來說,在資料倉庫中,可以降低更新統計資訊的頻率,當更新時,通常建議執行sp_updatestats存儲過程來實作。