網狀架構數據倉儲中的統計數據

適用於: Microsoft Fabric 中的 SQL 分析端點和倉儲

Microsoft Fabric 中的倉儲會使用查詢引擎,為指定的 SQL 查詢建立執行計劃。 當您提交查詢時,查詢優化器會嘗試列舉所有可能的計劃,並選擇最有效率的候選專案。 若要判斷哪一個計劃需要最少的額外負荷(I/O、CPU、記憶體),引擎必須能夠評估每個運算符可能處理的工作或數據列數量。 然後,根據每個方案的成本,它會選擇具有最少估計工時數量的方案。 統計數據是包含數據相關信息的物件,可讓查詢優化器估計這些成本。

如何利用統計數據

若要達到最佳查詢效能,請務必有精確的統計數據。 Microsoft Fabric 目前支援下列路徑,以提供相關且最新的統計數據:

所有數據表的手錶的手錶數據

Microsoft Fabric 提供維護統計數據健全狀況的傳統選項。 用戶可以分別使用 CREATE STATISTICSUPDATE 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 中手動建立和自動建立的統計數據:

查詢時的自動統計數據

每當發出查詢和查詢優化器需要統計數據以進行計劃探索時,如果這些統計數據不存在,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 中。 這些物件不會用於查詢優化。