Paul White Asked: 2022-11-04 14:06:14 +0800 CST2022-11-04 14:06:14 +0800 CST 2022-11-04 14:06:14 +0800 CST 为什么在聚集列存储上构建统计信息较慢? 772 在聚集列存储表上构建统计信息似乎总是读取整个表,即使我要求一个小样本。为什么是这样? sql-server 1 个回答 Voted Best Answer Paul White 2022-11-04T14:06:14+08:002022-11-04T14:06:14+08:00 堆或 b-tree 使用的抽样统计信息TABLESAMPLE SYSTEM。该算法采用分配顺序扫描,并从扫描中选择页面进行采样。所选页面上的所有行都对统计直方图有贡献。您可以在我对Strange behavior with sample sizes for statistics updates的回答中找到选择过程的详细信息。 聚集列存储的实现TABLESAMPLE SYSTEM方式不同。有两种不同的采样策略: 第一种算法仅在为列存储索引创建的主字典构建阶段选择行时使用(在下面的聚集列存储构建计划中突出显示)。 该实现针对性能进行了优化,但放弃了一些准确性。它使用在概念上类似于堆和 b 树的方法的集群抽样:随机选择一组行组,然后在每个选定组内随机抽样行。选择的行数和行组数来自抽样百分比。在初始步骤中未选择的行组不会从磁盘读取。 通过启用全局跟踪标志 11611,可以在 SQL Server 2019 或更高版本中跳过主字典构建阶段。 第二种算法总是用于统计构建。它使用真正随机的行级采样,但具有更高的 I/O 和 CPU 成本。它扫描列的所有段并随机选择行的子集。与仅对整个页面进行采样的 b 树和堆相比,这可以生成更准确的直方图。 最终的统计对象将反映所需的采样率。与堆或 b 树相比,该实现使这一点更难看到,因为在此过程中会读取所有段。
堆或 b-tree 使用的抽样统计信息
TABLESAMPLE SYSTEM
。该算法采用分配顺序扫描,并从扫描中选择页面进行采样。所选页面上的所有行都对统计直方图有贡献。您可以在我对Strange behavior with sample sizes for statistics updates的回答中找到选择过程的详细信息。聚集列存储的实现
TABLESAMPLE SYSTEM
方式不同。有两种不同的采样策略:第一种算法仅在为列存储索引创建的主字典构建阶段选择行时使用(在下面的聚集列存储构建计划中突出显示)。
该实现针对性能进行了优化,但放弃了一些准确性。它使用在概念上类似于堆和 b 树的方法的集群抽样:随机选择一组行组,然后在每个选定组内随机抽样行。选择的行数和行组数来自抽样百分比。在初始步骤中未选择的行组不会从磁盘读取。
通过启用全局跟踪标志 11611,可以在 SQL Server 2019 或更高版本中跳过主字典构建阶段。
第二种算法总是用于统计构建。它使用真正随机的行级采样,但具有更高的 I/O 和 CPU 成本。它扫描列的所有段并随机选择行的子集。与仅对整个页面进行采样的 b 树和堆相比,这可以生成更准确的直方图。
最终的统计对象将反映所需的采样率。与堆或 b 树相比,该实现使这一点更难看到,因为在此过程中会读取所有段。