天天看點

第十二章——SQLServer統計資訊(3)——發現過期統計資訊并處理前言:準備工作:步驟:分析:擴充知識:

        統計資訊是關于謂詞中的資料分布的主要資訊源,如果不知道具體的資料分布,優化器不能獲得預估的資料集,進而不能統計需要傳回的資料。

        在建立列的統計資訊後,在DML操作如insert、update、delete後,統計資訊就會過時。因為這些操作更改了資料,影響了資料分布。此時需要更新統計資訊。

        在高活動的表中,統計資訊可能幾個小時就會過時。對于靜态表,可能幾個星期才會過時。這要視乎表上DML的操作。

        從2000開始,SQLServer對增删改操作會增加在表sysindexes中的RowModCtr(Row Modification Counter)值,當統計資訊更新後,該值會重置會0,并重新累加。是以檢視這個表的這個值就可以知道統計資訊是否過時。

        在2000之後,SQLServer改變了這種跟蹤方式,把更改存放到對應的資料行上。這個值是未公開的ColModCtr。

        但是sys.sysindexes到2012依舊可用,還是可以用這個表的數值來确定是否過期。

本文将用到下面的系統視圖和相容性視圖:

1、  sys.sysindexes:相容性視圖,提供RowModCtr列值,是本文的核心。

2、  sys.indexes:使用表ID來獲得統計資訊名。

3、  sys.objects:擷取架構名。

顯示RowModCtr值很高的統計資訊:

需要了解一些事情:

1、  從你上次更新統計資訊是何時的事情?

2、  在更新統計資訊之後有多少事務發生在表上?

3、  哪些T-SQL需要用于更新統計資訊。

4、  更新統計資訊是否可行?這個是對比RowModCTR列和Total_Rows_In_Table列。

當在資料庫開啟了Auto_Update_Statistics之後,還有資料的話,那就有必要更新統計資訊。下面有一些規則:

1、  表大小從0增長。

2、  當表的資料小于等于500時沒有問題,并且ColModCtr從超過500行之後開始增長。

3、  當表的行數超過500行時,在統計資訊對象的引導列的ColModCtr值超過500+20%的行數時,就需要更新。

例子:有一個100萬行的表,優化器會在插入200500行新資料後認為統計資訊過時。但是這并不是絕對化的。

沒有直接的方式通路ColModCtr的值,因為它隻是用于優化引起,并且對使用者透明,但是可以使用DAC(專用管理者連接配接)來通路sys.sysrscols.rcmodified系統。但是僅在2008R2及以後版本才可用。