在 SQL Server 的統計的維護功能 (autostats)

文章翻譯 文章翻譯
文章編號: 195565 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

新引入統計的維護功能 AutoStat,可能會產生不必要的額外負荷生產系統上藉由執行下列動作之一:
  • 正在初始化期間重型生產統計更新。

    -或者-
  • 在時間內初始化極大量的更新統計資料處理程序在特定時點。
本文的目的是要在其下,您可以預期看到 autostats 產生及更新統計資料執行對資料庫中資料表的條件將詳細說明。

在 SQL Server 2000 autostats 有關請參閱下列 MSDN 網站上的"由查詢最佳化器在 Microsoft SQL Server 2000 的統計資料用於 」:
http://msdn2.microsoft.com/en-us/library/aa902688(SQL.80).aspx


附註如果您使用的 Microsoft SQL Server 2005,請參閱下列 Microsoft 白皮書,如需有關如何統計資料由查詢最佳化器在 SQL Server 2005 中資訊:
http://technet.microsoft.com/en-us/library/cc966419.aspx

其他相關資訊

一般資訊

SQL Server 會利用成本型最佳化器可以是非常機密統計資料表和索引上所提供的資訊。不正確且最新統計資訊 SQL Server 可以挑戰來決定特定查詢最佳的執行計劃。

在 SQL Server,成本為基礎的決策,讓包含協助您最佳化器中的每個資料表上維護的統計資料:
  • 在資料表中的資料列數目。
  • 在資料表所使用的分頁數目。
  • 統計資料上次更新後到表格的機碼所做的修改數目。
額外的資訊儲存為包括 (針對每個索引) 的索引:
  • 第一個資料行上的一個相等高度色階分佈圖。
  • 所有的資料行前置詞的密度。
  • 平均的金鑰長度。
每當建立新索引時,會自動建立索引的統計資料。在另外則現在可能建立和維護其他資料行的統計資料。

若要維護盡可能為最新的方式統計資訊,SQL Server 會介紹 AutoStat,透過 SQL Server 監視的資料表修改即能達到特定的變更閾值時,自動更新資料表的統計資料。 此外,SQL Server 會介紹自動-建立-的統計資料讓伺服器自動產生所需的特定查詢的準確最佳化的所有統計資料。

決定當 AutoStat 產生時將要

如上所述,AutoStat 就會自動更新特定資料表的統計資料變更閾值到達時。sysindexes.rowmodctr 欄會維護變動合計的資料表,經過一段時間,可能會造成不良的影響查詢處理器決策讓程序的所有修改。這個計數器會更新每次任何下列的事件發生時:
  • 進行單一資料列插入。
  • 進行單一資料列刪除。
  • 進行索引的資料行的更新。
注意: 截斷 TABLE 並不會更新 rowmodctr。

更新表格統計資料之後 rowmodctr 值重設為 0,而且更新資料表的統計資料的結構描述版本。

進一步的情況下的預存程序的執行計劃來自快取和該計劃是統計資料的機密,統計資料的結構描述版本會相較於目前的版本。如果沒有可用的新統計資料,將重新編譯預存程序計劃。

基本演算法的自動更新統計資料是:
  • 如果表格的維數是小於 6,且在 tempdb 資料庫中資料表,自動更新與資料表的每隔六個修改。
  • 如果表格的基數是大於 6,但小於或等於 500,更新狀態每隔 500 的修改。
  • 如果基數的表格是大於 500,更新統計資料時 (500 + 20%的資料表) 已發生變更。
  • 資料表變數為基數的變更不會觸發自動更新統計資料。
注意: 這個嚴格的意義在 SQL Server 計算基數隨著資料表中的資料列數目。

注意: 除了基數,述詞的選擇性也會影響 AutoStats 層代。這表示該統計資料可能無法更新的 afer 每隔 500 修改基數好像 < 500 或變更的每隔 20%的基數好像 > 500。根據選擇性產生向上因數 (值的範圍從 1 到 4、 1 和 4 (含)) 的比例,而且這項因素和變更如取自演算法數乘積會 AutoStats 產生所需的修改實際數目。

上述的演算法可以 summarised 資料表的形式:
_________________________________________________________________________________
 Table Type | Empty Condition | Threshold When Empty |Threshold When Not Empty 
_________________________________________________________________________________
 Permanent  | < 500 rows      | # of Changes >= 500  | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
 Temporary  | < 6 rows        | # of Changes >= 6    | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
Table
Variables   | Change in cardinality does not affect AutoStats generation.
___________________________________________________________________________
下列是為了示範這個概念的兩個範例:

範例 1

請考慮在 authors 資料表在 pubs 資料庫包含 23 個資料列,並有兩個索引。唯一叢集的索引,而 UPKCL_auidind,索引在一個資料行 au_id 上, 和複合的非叢集的索引,aunmind,已建立 au_lname 和 au_fname 資料行上。因為此資料表包含少於 500 的列,AutoStat 會開始後發生 500 變更資料表資料。所做的變更可以是 500 的其中一個或更多插入、 刪除、 變更為索引資料行例如 au_lname 或或是其他任何組合。

因此,可以預測當更新統計資料將會被初設是藉由監視 sysindexes.rowmodctr 值,也會在每次更新時遞增。當它到達,或超過 500 可以預期要啟動的更新統計資料。

範例 2

請考慮第二個資料表 t2 具有 1,000 的基數。對於具有大於 500 的列,SQL Server 將會更新統計資料時 (500 + 20%) 已經變更。數學,1,000 的 20%是 200,因此您可以預期看到 AutoStat 之後大約 700 修改已對資料表進行啟動。

自動化 Autostats 判斷

若要自動決定當您將會執行 AutoStat,可以輪詢 sysindexes 資料表,並識別當資料表的修改會到達起始點。下列是基本的演算法來執行這項作業:
   if (sysindexes.rows > 500)
      if (sysindexes.rows * 0.20 >= sysindexes.rowmodctr && production
      hours) //500 change leeway
         begin
            disable autostats
            log autostats disable
         end
      else
         begin
            stats ok
         end
   else
      if (sysindexes.rowmodctr >= 425) //75 change leeway
         begin
            disable autostats
            log autostats disable
         end
				

您可以稍後排程來執行下列工作:
  • 針對您被迫白天停用它們的所有資料表執行更新統計資料。

    -以及-
  • 因為每個資料表的修改計數器將已重設為 0 時執行更新統計資料,請重新啟用 AutoStat。

控制是否在對資料表執行更新統計資料

這個問題最明顯的解決方案時 AutoStat 已證明 Problematic,是停用自動統計資料產生藉此保留自由地在較不干擾式的時間排定更新統計資料的資料庫管理員。您可以這樣藉著使用更新統計資料的陳述式或 sp_autostats 預存程序。更新統計資料的陳述式的語法是:
   UPDATE STATISTICS <table>...with NORECOMPUTE
				

sp_autostats 預存程序的語法是:
sp_autostats <table_name>,<stats_flag>,<index_name>
其中 <stats_flag> 是 「 開啟 」 或 「 關閉 」。

您也可以使用 sp_dboption 停用自動更新統計資料或每個資料庫層級的 CREATE 統計資料的發生:
sp_dboption <dbname>,'自動更新統計' < 上 | 關閉 >

-或者-

sp_dboption <dbname>,'自動建立統計資料' < 上 | 關閉 >

控制並行更新統計資料處理程序數目

目前,短為特定的資料表,停用 AutoStat,就不可能設定正在同時執行的自動更新統計資料陳述式數目 (為此,DCR 51539 已經被歸檔)。伺服器不會但是,限制到每個處理器的四個並行更新統計資料處理數目。

判斷 Autostats 時正在執行

您可以使用追蹤旗標 205 來報告統計資料相關的預存程序會被重新編譯 AutoStat 的結果時。此追蹤旗標會寫入錯誤記錄檔的下列訊息:
發出 1998年-10-15 11:10:51.98 spid9 重新編譯: ProcName: sp_helpindex
LineNo: 75 StmtNo: 29
當啟用追蹤旗標 205 下列的訊息也括號 AutoStat 訊息從 8721 更新統計資料時。括弧的開啟郵件可以區別 RowModCnt 值將是大於 0。右方括號之後,UPDATE 統計資料會出現 RowModCnt 值為 0:
1998-10-15 11:38:43.68 spid8 結構描述變更: 資料表 Dbid: 7 Objid:
133575514 RowModCnt: 60500 RowModLimit: 60499
此訊息 RowModCnt 」 是資料表的修改總數。RowModLimit"是臨界值的超過時, 導致資料表的更新統計資料陳述式執行。

另外,也可以啟用追蹤旗標 8721,它 AutoStat 執行時便會將傾印到錯誤記錄檔的資訊。以下是訊息的您可以預期看到類型的範例:
1998-10-14 16:22:13.21 spid13 AUTOSTATS: 更新的資料表: [作者]
資料列數: 23 mods: 501 繫結: 500 的工期: 47ms UpdCount: 2
此訊息 Mods 」 是資料表的修改總數。 結合 」 是修改臨界值、 「 工期 」 是所需的更新統計資料的陳述式完成,所需的時間以及 UpdCount 」 是更新的統計資料的計數。

您也可以使用 SQL Server 分析工具來識別更新統計資料的陳述式執行時。若要執行此動作執行下列步驟:
  1. 在 [分析工具] 功能表上按一下 [工具],然後按一下 [選項]。
  2. 在 [一般] 索引標籤上移至 事件,] 然後選取 [所有事件類別
  3. 定義新的追蹤,並在 [事件],選取 其他,選取 [自動更新統計 sub-event。
注意: 如果正在更新許多統計資料,由 AutoStat,很棒的郵件數目可寫入錯誤記錄檔。徹底實驗這些追蹤旗標使用任何生產或否則重要的伺服器上之前。

結構描述鎖定

SQL Server 採用了兩種類型的結構描述鎖定時它會更新資料表的統計資料會採取的這兩種:
   Sch-S: Schema Stability Lock
   ----------------------------
   This lock ensures that a schema element, such as a table or index, will
   not be dropped while any session holds a schema stability lock on the
   schema element.

   Sch-M-UPD-STATS: Schema Modification Lock
   -----------------------------------------
   This is a non-blocking lock that is used by the system to ensure that
   only one automatic UPDATE STATISTICS process is run against a table at
   any given point in time. The sp_lock stored procedure will report this
   lock has having a type = TAB, resouce = UPD-STATS and mode = SCH-M.
				
藉由執行 sp_lock 或從 syslockinfo 資料表選取,您可以檢視這些鎖定。

屬性

文章編號: 195565 - 上次校閱: 2007年11月2日 - 版次: 7.6
這篇文章中的資訊適用於:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
關鍵字:?
kbmt kbinfo KB195565 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:195565
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com