UPDATE STATISTICS (Transact-SQL)

針對資料表或索引檢視表更新查詢最佳化統計資料。根據預設,查詢最佳化工具已經視需要更新統計資料,以便改善查詢計畫。不過,在某些情況下,您可以使用 UPDATE STATISTICS 或 sp_updatestats 預存程序,讓統計資料的更新頻率高於預設更新頻率,藉以改善查詢效能。

更新統計資料可確保查詢使用最新的統計資料進行編譯。不過,更新統計資料會導致查詢重新編譯。我們建議您不要太頻繁地更新統計資料,因為改善查詢計畫與重新編譯查詢所花費的時間之間具有效能權衡取捨。特定的權衡取捨完全取決於您的應用程式。

如需有關統計資料的詳細資訊,包括使用 UPDATE STATISTICS 的時機,請參閱<使用統計資料來改善查詢效能>。

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

語法

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 時所建立的單一資料行統計資料,以及針對索引所建立的統計資料。

    如需有關 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。將 PERCENT 或 ROWS 指定為 0 時,雖會更新統計資料物件,但是不會包含統計資料。

  • RESAMPLE
    使用最新的取樣率更新每一項統計資料。

    使用 RESAMPLE 可產生完整資料表掃描。例如,索引的統計資料會將完整資料表掃描用於其取樣率。如果未指定任何取樣選項 (SAMPLE、FULLSCAN、RESAMPLE),查詢最佳化工具依預設會取樣資料並計算取樣大小。

  • ALL | COLUMNS | INDEX
    更新所有現有的統計資料、針對一或多個資料行所建立的統計資料,或是針對索引所建立的統計資料。如果沒有指定任何選項,UPDATE STATISTICS 陳述式就會更新資料表或索引檢視表的所有統計資料。

  • NORECOMPUTE
    針對指定的統計資料停用自動統計資料更新選項 AUTO_UPDATE_STATISTICS。如果您指定了這個選項,查詢最佳化工具就會完成這項統計資料更新並停用未來的更新。

    若要重新啟用 AUTO_UPDATE_STATISTICS 選項行為,請再次執行不含 NORECOMPUTE 選項的 UPDATE STATISTICS 或執行 sp_autostats

    警告注意事項警告

    使用這個選項可能會產生次佳查詢計畫。我們建議您盡量少用這個選項,而且只有合格的系統管理員可以使用。

    如需有關 AUTO_STATISTICS_UPDATE 選項的詳細資訊,請參閱<ALTER DATABASE SET 選項 (Transact-SQL)>。如需有關停用並重新啟用統計資料更新的詳細資訊,請參閱<使用統計資料來改善查詢效能>。

  • <update_stats_stream_option>
    僅供參考之用。不支援。我們無法保證未來的相容性。

備註

使用 UPDATE STATISTICS 的時機

如需有關使用 UPDATE STATISTICS 之時機的詳細資訊,請參閱<使用統計資料來改善查詢效能>。

使用 sp_updatestats 來更新所有統計資料

如需有關如何針對資料庫中所有使用者定義和內部資料表更新統計資料的詳細資訊,請參閱預存程序<sp_updatestats (Transact-SQL)>。例如,下列命令會呼叫 sp_updatestats 來更新資料庫的所有統計資料。

EXEC sp_updatestats

判斷上次更新統計資料的時間

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

權限

需要資料表或檢視表的 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 資料表中 Name 和 ProductNumber 資料行的統計資料。

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 資料表中所有資料列的完整掃描,並且關閉 Products 統計資料的自動統計資料更新。

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

變更記錄

更新的內容

修訂整份文件以改善精確度。

此主題會參考<使用統計資料來改善查詢效能>主題中的新統計資料內容。