共用方式為


UPDATE STATISTICS (Transact-SQL)

更新: 2006 年 12 月 12 日

更新指定資料表或索引檢視中一或多個統計資料群組 (集合) 的索引鍵值散發相關資訊。若要建立資料行的統計資料,請參閱<CREATE STATISTICS (Transact-SQL)>。

主題連結圖示Transact-SQL 語法慣例

語法

UPDATE STATISTICS table | view 
    [ 
        { 
            { index | statistics_name }
          | ( { index |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 | view
    這是要更新統計資料之資料表或索引檢視的名稱。資料表或檢視名稱必須符合識別碼的規則。如需詳細資訊,請參閱<將識別碼當成物件名稱使用>。由於索引名稱在每個資料庫內並不是唯一的,因此,您必須指定 tableview。您可以選擇性地指定資料庫、資料表或檢視結構描述。
  • index
    這是正在更新統計資料的索引。索引名稱必須符合識別碼的規則。如果未指定 index,就會更新指定資料表或索引檢視中的所有散發統計資料。這包括使用 CREATE STATISTICS 陳述式建立的統計資料、自動建立的統計資料,以及索引建立時產生之副產品的統計資料。

    若要顯示物件索引的報表,請執行 sp_helpindex,再指定資料表或檢視名稱。

  • statistics_name
    這是要更新的統計資料群組 (集合) 的名稱。統計資料名稱必須符合識別碼的規則。如需有關建立統計資料群組的詳細資訊,請參閱<CREATE STATISTICS (Transact-SQL)>。
  • FULLSCAN
    指定應該讀取 tableview 中的所有資料列來收集統計資料。FULLSCAN 提供 SAMPLE 100 PERCENT 的相同行為。FULLSCAN 不能搭配 SAMPLE 選項一起使用。
  • SAMPLE number { PERCENT | ROWS }
    指定在收集較大資料表或檢視的統計資料時,要取樣的資料表或索引檢視的百分比或資料列數。number 必須是整數,不論它是 PERCENT 或 ROWS,都是如此。若要使用較大資料表或檢視的預設取樣行為,請搭配 PERCENT 或 ROWS 來使用 SAMPLE number。SQL Server 2005 Database Engine 確定所取樣之值的數量會達到下限,以保證統計資料有用。如果 PERCENT、ROWS 或 number 選項造成取樣資料列數太少,則 Database Engine 會根據資料表或檢視中現有的資料列數來自動更正取樣。取樣至少會有大約 1,000 個資料頁。如果 PERCENT、ROWS 或 number 選項所建立的值,數量超出有用取樣所需要的數目,則 Database Engine 會嘗試符合所要求的取樣數量。不過,由於取樣的方式是掃描所有資料頁,因此,實際樣本大小可能不完全符合指定的數量。當指定 0 PERCENT 或 ROWS 時,結果是空的統計資料集合。

    ms187348.note(zh-tw,SQL.90).gif附註:
    預設行為是在目標資料表或索引檢視執行樣本掃描。Database Engine 會自動計算所需要的樣本大小。
  • RESAMPLE
    指定將利用所有現有統計資料 (包括索引) 之繼承的取樣比率來收集統計資料。如果取樣比率所建立的取樣資料列數太少,Database Engine 會根據資料表或檢視中現有的資料列數來自動更正取樣。
  • ALL | COLUMNS | INDEX
    指定 UPDATE STATISTICS 陳述式是否會影響資料行統計資料、索引統計資料,或所有現有的統計資料。如果未指定任何選項,UPDATE STATISTICS 陳述式會影響所有統計資料。每個 UPDATE STATISTICS 陳述式都只能指定一個類型 (ALL、COLUMNS 或 INDEX)。
  • NORECOMPUTE
    指定不自動重新計算過期的統計資料。統計資料的過期,會隨著索引資料行所執行的 INSERT、UPDATE 和 DELETE 作業數目而不同。當指定這個選項時,它會使 Database Engine 停用統計資料的自動重建功能。若要還原統計資料的自動重新計算,請重新發出不含 NORECOMPUTE 選項的 UPDATE STATISTICS,或執行 sp_autostats

    ms187348.note(zh-tw,SQL.90).gif重要事項:
    停用統計資料的自動重新計算之後,查詢最佳化工具可能會為涉及指定資料表的查詢選擇比較不理想的策略。
  • <update_stats_stream_option>
    警告僅做為識別目的。不支援。我們無法保證未來的相容性。

備註

Database Engine 會保留各索引中之索引鍵值的散發統計資料,且會利用這些統計資料來判斷查詢處理要用哪個或哪些索引。使用者可以利用 CREATE STATISTICS 陳述式來建立非索引資料行的統計資料。查詢最佳化會隨著散發步驟的精確度而不同:

  • 如果索引中的索引鍵值有重要的變更,請針對索引重新執行 UPDATE STATISTICS。
  • 如果加入、變更或移除索引資料行中的大量資料 (也就是說,索引鍵值的散發有了改變),或已利用 TRUNCATE TABLE 陳述式來截斷資料表,再重新擴展這份資料表,請使用 UPDATE STATISTICS。

若要知道上次更新統計資料的時間,請使用 STATS_DATE 函數。

UPDATE STATISTICS WITH RESAMPLE 會依照目前的取樣比率來更新資料表的所有統計資料。這表示在建立索引時利用完整掃描來建立的索引統計資料,需要重新整理完整的資料表掃描。這項作業可能會花許多時間,當它涉及含有許多索引的大型資料分割資料表時,尤其如此。重新整理每項統計資料需要讀取大量資料。若要避免這個問題,請考慮使用 sp_updatestats (Transact-SQL)。這只會在需要統計資料時,才更新統計資料。

只有在條件允許建立計算資料行的索引時,才能建立或更新含計算資料行之資料表的統計資料。如需有關建立計算資料行的索引之需求和限制的詳細資訊,請參閱<CREATE INDEX (Transact-SQL)>。

如果您停用統計資料的自動重新計算,您必須手動更新統計資訊。

ms187348.note(zh-tw,SQL.90).gif附註:
除非指定了 NORECOMPUTE 子句,否則,UPDATE STATISTICS 陳述式會重新啟用目標資料表或檢視的自動統計更新。

權限

需要資料表或檢視的 ALTER 權限。

範例

A. 更新單一資料表的所有統計資料

下列範例會更新 SalesOrderDetail 資料表所有索引的散發統計資料。

USE AdventureWorks;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO

B. 只更新單一索引的統計資料

下列範例只會更新 SalesOrderDetail 資料表之 AK_SalesOrderDetail_rowguid 索引的散發資訊。

USE AdventureWorks;
GO
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;
GO

C. 利用 50% 取樣來更新特定統計資料群組 (集合) 的統計資料

下列範例會建立再更新 Product 資料表之 NameProductNumber 資料行的統計資料群組。

USE AdventureWorks;
GO
CREATE STATISTICS Products
    ON Production.Product ([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products) 
    WITH SAMPLE 50 PERCENT;

D. 利用 FULLSCAN 和 NORECOMPUTE 來更新特定統計資料群組 (集合) 的統計資料

下列範例會更新 Product 資料表中的 Products 統計資料群組 (集合),強制執行 Product 資料表中所有資料列的完整掃描,再關閉統計資料群組 (集合) 的自動統計更新。

USE AdventureWorks;
GO
UPDATE STATISTICS Production.Product(Products)
    WITH FULLSCAN, NORECOMPUTE;
GO

請參閱

參考

ALTER DATABASE (Transact-SQL)
CREATE INDEX (Transact-SQL)
CREATE STATISTICS (Transact-SQL)
sys.stats (Transact-SQL)
sys.stats_columns (Transact-SQL)
資料指標 (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL)
EXECUTE (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_autostats (Transact-SQL)
sp_createstats (Transact-SQL)
sp_helpindex (Transact-SQL)
sp_updatestats (Transact-SQL)
STATS_DATE (Transact-SQL)

其他資源

函數 (Database Engine)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

變更的內容:
  • 從<備註>移除「在明確或隱含的交易中,不允許使用 UPDATE STATISTICS。」的陳述。此限制不適用於 SQL Server 2005。