Fabric 数据仓库中的统计信息

适用于:SQL 分析终结点和 Microsoft Fabric 中的仓库

Microsoft Fabric 中的仓库使用查询引擎为给定的 SQL 查询创建执行计划。 提交查询时,查询优化器会尝试枚举所有可能的计划并选择最有效的候选项。 若要确定哪个计划需要最少的开销(I/O、CPU、内存),引擎需要能够评估每个操作员可能处理的工时或行量。 然后,根据每个计划的成本,它会选择估计工时最少的计划。 统计信息是包含有关数据相关信息的对象,允许查询优化器估算这些成本。

如何利用统计信息

若要实现最佳查询性能,必须具有准确的统计信息。 Microsoft Fabric 目前支持通过以下路径来提供相关和最新的统计信息:

所有表的手动统计信息

Microsoft Fabric 中提供了维护统计信息运行状况的传统选项。 用户可以分别使用 CREATE STATISTICSUPDATE STATISTICSDROP STATISTICS 来创建、更新和删除基于直方图的单列统计信息。 用户还可以使用 DBCC SHOW_STATISTICS 查看基于直方图的单列统计信息的内容。 目前支持这些语句的有限版本。

  • 如果手动创建统计信息,请考虑重点关注查询工作负载中频繁使用的统计信息(特别是在 GROUP BY、ORDER BY、筛选器和 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、JONN、DISTINCT 子句、筛选器(WHERE 子句)和 ORDER BY 中引用的列请求这些信息。 例如,如果你想查看这些统计信息的自动创建,查询会在 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.stats_columnssys.columns 上的 JOIN。

现在,可以找到 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');

DBCC SHOW_STATISTICS 结果集中的 Updated 值应该是日期 (UTC),类似于运行原始 GROUP BY 查询的日期。

查询引擎随后可以在后续查询中利用这些自动生成的统计信息,以改善计划成本计划和执行效率。 如果表中发生了足够的更改,则查询引擎还将刷新这些统计信息以改进查询优化。 在对表进行重大更改后,可以应用上一个相同的示例练习。 在 Fabric 中,SQL 查询引擎使用与 SQL Server 2016 (13.x) 相同的重新编译阈值来刷新统计信息。

自动生成的统计信息的类型

在 Microsoft Fabric 中,引擎会自动生成多种类型的统计信息来改进查询计划。 目前,可以在 sys.stats 中找到它们,但并非所有项均可操作:

  • 直方图统计信息
    • 根据在查询时需要直方图统计信息的列创建
    • 这些对象包含有关特定列分布的直方图和密度信息。 类似于查询时在 Azure Synapse Analytics 专用池中自动创建的统计信息。
    • 名称以 _WA_Sys_ 开头。
    • 可以使用 DBCC SHOW_STATISTICS 查看内容
  • 平均列长度统计信息
    • 为大于 100 的可变字符列 (varchar) 创建,查询时需要平均列长度。
    • 这些对象包含一个值,该值表示创建统计信息时 varchar 列的平均行大小。
    • 名称以 ACE-AverageColumnLength_ 开头。
    • 用户无法查看或操作内容。
  • 基于表的基数统计信息
    • 根据在查询时需要基数估计的表创建。
    • 这些对象包含表的行计数的估计值。
    • 命名为 ACE-Cardinality
    • 用户无法查看或操作内容。

限制

  • 只能手动创建和修改单列直方图统计信息。
  • 不支持创建多列统计信息。
  • 其他统计信息对象可能与手动创建的统计信息和自动创建的统计信息一起显示在 sys.stats 中。 这些对象不用于查询优化。