網狀架構數據倉儲中的統計數據
適用於: Microsoft Fabric 中的 SQL 分析端點和倉儲
Microsoft Fabric 中的倉儲會使用查詢引擎來建立指定 SQL 查詢的執行計劃。 當您提交查詢時,查詢優化器會嘗試列舉所有可能的計劃,並選擇最有效率的候選專案。 若要判斷哪一個計劃需要最少的額外負荷(I/O、CPU、記憶體),引擎必須能夠評估每個運算符可能處理的工作或數據列數量。 然後,根據每個方案的成本,它會選擇具有最少估計工時數量的方案。 統計數據是包含數據相關信息的物件,可讓查詢優化器估計這些成本。
如何利用統計數據
若要達到最佳查詢效能,請務必有精確的統計數據。 Microsoft Fabric 目前支援下列路徑,以提供相關且最新的統計數據:
- 使用者定義的統計數據
- 用戶會視需要發出 DDL 來建立、更新和卸除統計數據
- 自動統計數據
- 引擎會在查詢時間自動 建立和維護統計數據
所有數據表的手錶的手錶數據
維護統計數據健全狀況的傳統選項可在 Microsoft Fabric 中使用。 用戶可以分別使用 CREATE STATISTICS、 UPDATE STATISTICS 和 DROP STATISTICS 來建立、更新和 卸除直方圖型單一數據行統計數據。 使用者也可以使用 DBCC SHOW_STATISTICS來檢視直方圖型單一數據行統計數據的內容。 目前支持這些語句的有限版本。
- 如果手動建立統計數據,請考慮將焦點放在查詢工作負載中大量使用的統計數據(特別是在 GROUP BYs、ORDER BYs、篩選器和 JOIN 中)。
- 請考慮在數據變更之後定期更新數據行層級統計數據,以大幅變更數據列計數或散發數據。
手動統計數據維護的範例
若要根據數據列CustomerKey
中的所有數據列,在數據表上dbo.DimCustomer
建立統計數據:
CREATE STATISTICS DimCustomer_CustomerKey_FullScan
ON dbo.DimCustomer (CustomerKey) WITH FULLSCAN;
若要手動更新統計數據物件 DimCustomer_CustomerKey_FullScan
,可能是在大型數據更新之後:
UPDATE STATISTICS dbo.DimCustomer (DimCustomer_CustomerKey_FullScan) WITH FULLSCAN;
若要顯示統計資料物件的相關資訊:
DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan");
只顯示統計資料物件直方圖的相關信息:
DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan") WITH HISTOGRAM;
若要手動卸除統計資料物件 DimCustomer_CustomerKey_FullScan
:
DROP STATISTICS dbo.DimCustomer.DimCustomer_CustomerKey_FullScan;
下列 T-SQL 物件也可以用來檢查在 Microsoft Fabric 中手動建立和自動建立的統計數據:
- sys.stats 目錄檢視
- sys.stats_columns目錄檢視
- STATS_DATE系統函式
查詢時的自動統計數據
每當發出查詢和查詢優化器需要統計數據以進行計劃探索時,Microsoft Fabric 會在這些統計數據不存在時自動建立這些統計數據。 建立統計數據之後,查詢優化器就可以利用它們來估計觸發查詢的計劃成本。 此外,如果查詢引擎判斷與查詢相關的現有統計數據不再準確地反映數據,這些統計數據將會自動重新整理。 由於這些自動作業會以同步方式完成,因此如果上次統計數據重新整理之後,所需的統計數據尚未存在或重大數據變更,您可以預期查詢持續時間會包含這一次。
在查詢時間確認自動統計數據
有各種情況,您可以預期某種類型的自動統計數據。 最常見的是以直方圖為基礎的統計數據,這是查詢優化器針對 GROUP BY、JOIN、DISTINCT 子句、篩選條件(WHERE 子句)和 ORDER BYs 中所參考的數據行所要求。 例如,如果您想要查看這些統計數據的自動建立,如果的統計數據 COLUMN_NAME
不存在,查詢將會觸發建立。 例如:
SELECT <COLUMN_NAME>
FROM <YOUR_TABLE_NAME>
GROUP BY <COLUMN_NAME>;
在此情況下,您應該預期已建立 的 COLUMN_NAME
統計數據。 如果數據行也是 varchar 數據行,您也會看到建立的平均數據行長度統計數據。 如果您要驗證統計資料已自動建立,您可以執行下列查詢:
select
object_name(s.object_id) AS [object_name],
c.name AS [column_name],
s.name AS [stats_name],
s.stats_id,
STATS_DATE(s.object_id, s.stats_id) AS [stats_update_date],
s.auto_created,
s.user_created,
s.stats_generation_method_desc
FROM sys.stats AS s
INNER JOIN sys.objects AS o
ON o.object_id = s.object_id
INNER JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id
AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c
ON sc.object_id = c.object_id
AND c.column_id = sc.column_id
WHERE o.type = 'U' -- Only check for stats on user-tables
AND s.auto_created = 1
AND o.name = '<YOUR_TABLE_NAME>'
ORDER BY object_name, column_name;
此查詢只會尋找以數據行為基礎的統計數據。 如果您想要查看此資料表的所有統計數據,請移除 和 sys.columns
上的 sys.stats_columns
JONS。
現在,您可以找到 statistics_name
自動產生的直方圖統計數據的 ,並 _WA_Sys_00000007_3B75D760
執行下列 T-SQL:
DBCC SHOW_STATISTICS ('<YOUR_TABLE_NAME>', '<statistics_name>');
例如:
DBCC SHOW_STATISTICS ('sales.FactInvoice', '_WA_Sys_00000007_3B75D760');
Updated
DBCC SHOW_STATISTICS結果集中的值應該是與執行原始 GROUP BY 查詢時類似的日期(UTC)。
然後,查詢引擎可以在後續查詢中運用這些自動產生的統計數據,以改善計劃成本和執行效率。 如果數據表中發生足夠的變更,查詢引擎也會重新整理這些統計數據,以改善查詢優化。 變更數據表之後,可以套用相同的先前範例練習。 在 Fabric 中,SQL 查詢引擎會使用與 SQL Server 2016 (13.x) 相同的重新編譯閾值來重新整理統計數據。
自動產生的統計數據類型
在 Microsoft Fabric 中,引擎會自動產生多種類型的統計數據,以改善查詢計劃。 目前,您可以在 sys.stats 中找到它們,但並非所有專案都可以採取動作:
- 直方圖統計數據
- 在查詢時間建立每個需要直方圖統計數據的數據行
- 這些物件包含有關特定數據行分佈的直方圖和密度資訊。 類似於在 Azure Synapse Analytics 專用集區中查詢時間自動建立的統計數據。
- 名稱開頭為
_WA_Sys_
。 - 您可以使用 DBCC SHOW_STATISTICS 檢視 內容
- 平均數據行長度統計數據
- 針對在查詢時間需要平均數據行長度的變數字元數據行 (varchar) 建立。
- 這些物件包含值,代表建立統計數據時 varchar 數據行的平均數據列大小。
- 名稱開頭為
ACE-AverageColumnLength_
。 - 無法檢視內容,而且無法由使用者操作。
- 以數據表為基礎的基數統計數據
- 在查詢時間建立每個需要基數估計的數據表。
- 這些物件包含數據表數據列計數的估計值。
- 具名
ACE-Cardinality
。 - 無法檢視內容,而且無法由使用者操作。
限制
- 只能手動建立和修改單一數據行直方圖統計數據。
- 不支援建立多數據行統計數據。
- 除了手動建立的統計數據和自動建立的統計數據之外,其他統計數據物件可能會出現在 sys.stats 中。 這些物件不會用於查詢優化。
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應