適用於:SQL Server
Azure SQL Database
Azure SQL 受控執行個體
Azure Synapse Analytics
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉庫
Microsoft Fabric 中的 SQL 資料庫
更新數據表或索引檢視表的查詢優化 統計數據 。 根據預設,查詢最佳化工具已經會視需要更新統計資料來改善查詢計劃。在某些情況下,您可以使用 UPDATE STATISTICS 或 sp_updatestats 預存程序,讓統計資料的更新頻率高於預設更新頻率,以改善查詢效能。
更新統計資料可確保查詢使用最新的統計資料進行編譯。 透過任何進程更新統計數據可能會導致查詢計劃自動重新編譯。 我們建議您不要太頻繁地更新統計資料,因為改善查詢計劃與重新編譯查詢所花費的時間之間具有效能權衡取捨。 特定的權衡取捨完全取決於您的應用程式。
UPDATE STATISTICS 可以使用 tempdb 來排序資料列的範例,以建立統計資料。
Note
欲了解更多關於Fabric Data Warehouse統計及SQL分析端點的資訊,請參閱Fabric Data Warehouse統計。
Syntax
SQL Server、Azure SQL Database、Azure SQL 受控執行個體 以及 Fabric 中的 SQL 資料庫的語法。
UPDATE STATISTICS table_or_indexed_view_name
[
{
{ index_or_statistics__name }
| ( { index_or_statistics_name } [ , ...n ] )
}
]
[ WITH
[
FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| RESAMPLE
[ ON PARTITIONS ( { <partition_number> | <range> } [ , ...n ] ) ]
| <update_stats_stream_option> [ , ...n ]
]
[ [ , ] [ ALL | COLUMNS | INDEX ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
] ;
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_constant ]
Syntax for Azure Synapse Analytics.
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name | index_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
| RESAMPLE
}
]
[;]
Fabric Data Warehouse 語法與 SQL 分析端點。
UPDATE STATISTICS [ schema_name . ] table_name
[ ( { statistics_name } ) ]
[ WITH
{
FULLSCAN
| SAMPLE number PERCENT
}
]
[;]
Note
Azure Synapse Analytics 的無伺服器 SQL 集區不支援此語法。
Arguments
table_or_indexed_view_name
包含統計數據對象的數據表或索引檢視表名稱。
index_or_statistics_name或statistics_name | index_name或statistics_name
要更新統計數據的索引名稱,或要更新之統計數據的名稱。 如果未 指定index_or_statistics_name 或 statistics_name ,查詢優化器會更新數據表或索引檢視表的所有統計數據。 這包括使用語句建立的 CREATE STATISTICS 統計數據、建立時 AUTO_CREATE_STATISTICS 建立的單一數據行統計數據,以及針對索引建立的統計數據。
欲了解更多資訊 AUTO_CREATE_STATISTICS,請參閱 ALTER DATABASE SET 選項。 若要檢視資料表或檢視表的所有索引,您可以使用 sp_helpindex。
FULLSCAN
掃描資料表或索引檢視表中的所有資料列,藉以計算統計資料。
FULLSCAN 和 SAMPLE 100 PERCENT 具有相同的結果。
FULLSCAN 無法搭配 SAMPLE 選項使用。
範例 數位 { PERCENT |ROWS }
指定當查詢最佳化工具更新統計資料時,要在資料表或索引檢視表中使用的近似百分比或資料列數目。 針對 ,PERCENT 可以是從 0 到 100,而 針對 ROWS,number 可以從 0 到數據列總數。 查詢最佳化工具所取樣的實際百分比或資料列數目可能會與指定的百分比或數目不符。 例如,查詢最佳化工具會掃描資料頁面上的所有資料列。
SAMPLE 對於以預設取樣為基礎的查詢計劃不是最佳的特殊案例,會很有用。 在大部分情況下,不需要指定 SAMPLE ,因為查詢優化器會使用取樣,並默認判斷統計顯著樣本大小,以建立高品質的查詢計劃。
Note
在 SQL Server 2016 (13.x) 中使用資料庫相容性層級 130 時,會平行進行數據取樣來建置統計數據,以改善統計數據收集的效能。 每當數據表大小超過特定閾值時,查詢優化器就會使用平行範例統計數據。 從 SQL Server 2017 (14.x)開始,不論資料庫相容性層級為何,行為都會變更回使用序列掃描,以避免發生過多 LATCH 等候的潛在效能問題。 更新統計數據時,其餘的查詢計劃將會在限定時維持平行執行。
SAMPLE 無法搭配 FULLSCAN 選項使用。
SAMPLE未指定 或 FULLSCAN 時,查詢優化器會使用取樣的數據,並預設計算樣本大小。
建議您不指定 0 PERCENT 或 0 ROWS。 指定 或 0 PERCENT 時0 ROWS,統計數據物件會更新,但不包含統計數據數據。
大部分的工作負載都不需要進行完整掃描,且預設取樣就已足夠。 不過,對廣泛不同數據散發敏感的特定工作負載可能需要增加樣本大小,甚至完整掃描。 雖然估計值可能比取樣掃描更精確,但複雜的計劃可能沒有大幅受益。
如需詳細資訊,請參閱 統計數據的元件和概念。
RESAMPLE
使用最新的取樣率更新每一項統計資料。
使用 RESAMPLE 可能會導致完整表掃描。 例如,索引的統計資料會將完整資料表掃描用於其取樣率。 未指定任何範例選項 (SAMPLE、 FULLSCANRESAMPLE、 ) 時,查詢優化器會取樣數據,並預設計算樣本大小。
SQL 分析端點或 Fabric Data Warehouse 不支援這個RESAMPLE選項。
PERSIST_SAMPLE_PERCENT = { ON |OFF }
適用於:SQL Server(從 SQL Server 2016 (13.x) Service Pack 1 CU 4 及 SQL Server 2017 (14.x) CU 1 開始)、Azure SQL Database 及 Azure SQL 受控執行個體
當 為 時 ON,統計數據會保留未明確指定取樣百分比的後續更新的設定取樣百分比。 當 時 OFF,統計數據取樣百分比將會在未明確指定取樣百分比的後續更新中重設為預設取樣。 預設值為 OFF。
DBCC SHOW_STATISTICS 和 sys.dm_db_stats_properties 會針對選取的統計資料公開保存的取樣百分比值。
如果 AUTO_UPDATE_STATISTICS 已執行,則會在可用時使用保存的取樣百分比,否則請使用預設取樣百分比。
RESAMPLE 行為不受此選項影響。
如果資料表遭到截斷,則以截斷堆積或 B 型樹狀結構 (HoBT) 為基礎的所有統計資料都會使用預設取樣百分比還原為 。 同樣地,如果在沒有數據列的物件上更新統計數據,即使先前已設定,它仍會還原為使用預設取樣百分比 PERSIST_SAMPLE_PERCENT 。
Note
在 SQL Server 中,重建先前更新 PERSIST_SAMPLE_PERCENT統計數據的索引時,保存的範例百分比會重設為預設值。 從 SQL Server 2016 (13.x) SP2 CU17、SQL Server 2017 (14.x) CU26 和 SQL Server 2019 (15.x) CU10 開始,保存的取樣百分比即便在重建索引時也會保留。
ON PARTITIONS ( { <partition_number> | <range> } [ , ...n ] ) ]
適用於:SQL Server 2014 (12.x) 和更新版本
強制重新計算 子句中指定的 ON PARTITIONS 分割區分葉層級統計數據,然後合併以建置全域統計數據。
WITH RESAMPLE 是必要的,因為以不同的取樣率建置的數據分割統計數據無法合併在一起。
全部 |欄位 | INDEX
更新所有現有的統計資料、針對一或多個資料行所建立的統計資料,或是針對索引所建立的統計資料。 如果未指定任何選項,語句會 UPDATE STATISTICS 更新數據表或索引檢視表上的所有統計數據。
NORECOMPUTE
針對指定的統計資料停用自動統計資料更新選項 AUTO_UPDATE_STATISTICS。 如果您指定了這個選項,查詢最佳化工具就會完成這項統計資料更新並停用未來的更新。
若要重新啟用 AUTO_UPDATE_STATISTICS 選項行為,請再次執行 UPDATE STATISTICS ,而不 NORECOMPUTE 使用 選項或執行 sp_autostats。
Warning
使用這個選項可能會產生次佳查詢計劃。 我們建議您盡量少用這個選項,而且只有合格的系統管理員可以使用。
欲了解更多選項資訊 AUTO_STATISTICS_UPDATE ,請參閱 ALTER DATABASE SET 選項。
INCREMENTAL = { ON |OFF }
適用於:SQL Server 2014 (12.x) 和更新版本
當 為 時 ON,系統會根據分割區統計數據重新建立統計數據。 當 為 時 OFF,會卸除統計數據樹狀目錄,而 SQL Server 會重新計算統計數據。 預設值為 OFF。
如果不支援依據每個分割區的統計資料,則會產生錯誤。 針對下列統計資料類型,不支援累加統計資料:
- 建立統計資料時,所使用的索引未與基底資料表進行分割區對齊。
- 在 AlwaysOn 可讀取次要資料庫上建立的統計資料。
- 在唯讀資料庫上建立的統計資料。
- 在篩選的索引上建立的統計資料。
- 在檢視上建立的統計資料。
- 在內部資料表上建立的統計資料。
- 使用空間索引或 XML 索引建立的統計資料。
MAXDOP = max_degree_of_parallelism
適用於:SQL Server (從 SQL Server 2016 (13.x) SP2 開始,以及 SQL Server 2017 (14.x) CU3)。
覆 max degree of parallelism 寫統計數據作業持續時間的組態選項。 如需詳細資訊,請參閱 伺服器組態:平行處理原則的最大程度。 使用 MAXDOP 來限制平行計劃執行中使用的處理器數目。 最大值是 64 個處理器。
max_degree_of_parallelism 可以是:
1
隱藏平行計畫的產生。
>1
根據目前的系統工作負載,將平行統計作業中使用的處理器數目上限限製為指定的數目或更少。
0 (預設值)
根據目前的系統工作負載,使用實際數目或比實際數目更少的處理器。
update_stats_stream_option
僅供參考之用。 不支援。 我們無法保證未來的相容性。
AUTO_DROP = { ON |OFF }
適用於:SQL Server 2022 (16.x) 和更新版本
目前,如果統計數據是由客戶資料庫上的第三方工具所建立,這些統計數據物件可能會封鎖或干擾客戶可能想要的架構變更。
(從 SQL Server 2022 開始 (16.x)] |這項功能允許在模式中建立統計數據物件,讓架構變更 不會遭到統計數據封鎖,而是會卸除統計數據。 如此一來,自動卸除統計資料的行為就會和自動建立的統計資料一樣。
Note
嘗試在自動建立的統計數據上設定或取消設定 AUTO_DROP 屬性可能會引發錯誤。 自動建立的統計數據一律會使用自動卸除。 某些備份在還原時可能會設定此屬性不正確,直到下次更新統計數據物件時(手動或自動)。 不過,在 Azure SQL Database、Azure SQL 受控實例和 SQL Server 2022 (16.x) 和更新版本中,自動建立的統計數據一律會像已設定 AUTO_DROP 一樣運作。
Remarks
何時開始 UPDATEUPDATE STATISTICS
如需何時使用 UPDATE STATISTICS的詳細資訊,請參閱 何時更新統計數據。
Limitations
不支援在外部資料表上更新統計資料。 若要更新外部資料表上的統計資料,請卸除並重新建立統計資料。
不支援在數據行存放區索引上自動更新所建立的統計數據。 嘗試這樣做會導致錯誤 35337:
UPDATE STATISTICS failed because statistics can't be updated on a columnstore index. UPDATE STATISTICS is valid only when used with the STATS_STREAM option.如需詳細資訊,請參閱 索引統計數據。支援更新個別數據行的統計數據,或支援數據行存放區索引的數據行集合。
MAXDOP選項與STATS_STREAM、ROWCOUNT和PAGECOUNT選項不相容。MAXDOP選項受限於 Resource Governor 工作負載MAX_DOP設定 (如果已使用)。sp_updatestats這個儲存程序在 SQL 分析端點或 Fabric Data Warehouse 中並不支援。
使用 sp_updatestats 更新所有統計數據
如需如何更新資料庫中所有使用者定義和內部數據表統計數據的相關信息,請參閱預存程式 sp_updatestats。 例如,下列命令會呼叫 sp_updatestats 來更新資料庫的所有統計數據。
EXECUTE sp_updatestats;
自動索引與統計資料管理
利用自適性索引子磁碟重組等解決方案,為一或多個資料庫自動管理索引重組以及統計資料更新。 這項程序會根據索引分散程度與其他參數,自動選擇要進行重建或是重新組織索引,並以線性閾值更新統計資料。
判斷上次統計數據更新
若要判斷上次更新統計資料的時間,請使用 STATS_DATE 函數。
Azure Synapse Analytics
以下語法不支援 Azure Synapse Analytics:
UPDATE STATISTICS t1 (a, b);
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;
UPDATE STATISTICS t1 (a) WITH STATS_STREAM = 0x01;
Permissions
必須具備資料表或檢視的 ALTER 權限。
Examples
A. 更新資料表的所有統計資料
下列範例會更新 SalesOrderDetail 資料表上的所有統計資料。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
B. 更新索引的統計資料
下列範例會針對 AK_SalesOrderDetail_rowguid 資料表的 SalesOrderDetail 索引更新統計資料。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Sales.SalesOrderDetail (AK_SalesOrderDetail_rowguid);
GO
C. 使用 50% 取樣來更新統計資料
下列範例會建立再更新 Name 資料表中 ProductNumber 和 Product 資料行的統計資料。
USE AdventureWorks2022;
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 來更新統計資料
下列範例會更新 Products 資料表中的 Product 統計資料、強制執行 Product 資料表中所有資料列的完整掃描,並且關閉 Products 統計資料的自動統計資料更新。
USE AdventureWorks2022;
GO
UPDATE STATISTICS Production.Product (Products)
WITH FULLSCAN, NORECOMPUTE;
GO
範例:Azure Synapse Analytics
E. 更新資料表上的統計資料
下列範例會更新 CustomerStats1 資料表上的 Customer 統計資料。
UPDATE STATISTICS Customer (CustomerStats1);
F. 使用完整掃描更新統計資料
下列範例會根據掃描 CustomerStats1 資料表中的所有資料列來更新 Customer 統計資料。
UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;
G. 更新資料表的所有統計資料
下列範例會更新 Customer 資料表上的所有統計資料。
UPDATE STATISTICS Customer;
H. 與AUTO_DROP的使用CREATE STATISTICS
如需使用自動卸除統計資料,只要將下列內容新增至統計資料建立或更新的 "WITH" 子句即可。
UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON;
相關內容
- Statistics
- 網狀架構數據倉儲中的統計數據
- ALTER DATABASE (Transact-SQL)
- sys.dm_db_stats_properties (Transact-SQL)
- sys.dm_db_stats_histogram (Transact-SQL)
- CREATE STATISTICS (Transact-SQL)
- DBCC SHOW_STATISTICS (Transact-SQL)
- DROP STATISTICS (Transact-SQL)
- sys.sp_autostats(Transact-SQL)
- sys.sp_updatestats(Transact-SQL)
- STATS_DATE (Transact-SQL)