Pau*_*ite 8 sql-server statistics columnstore
即使我要求一个小样本,在聚集列存储表上构建统计信息似乎总是会读取整个表。为什么是这样?
Pau*_*ite 12
堆或 B 树使用的采样统计信息TABLESAMPLE SYSTEM
。该算法采用分配顺序扫描并从扫描中选择页面进行采样。所选页面上的所有行都会构成统计直方图。您可以在我对统计数据更新的样本大小的奇怪行为的回答中找到选择过程的详细信息。
集群列存储的实现方式TABLESAMPLE SYSTEM
不同。有两种单独的采样策略:
第一个算法仅在为列存储索引创建的主字典构建阶段选择行时使用(在下面的聚集列存储构建计划中突出显示)。
该实现针对性能进行了优化,但牺牲了一些准确性。它使用概念上类似于堆和 B 树方法的聚类采样:随机选择一组行组,然后对每个选定组内的行进行随机采样。所选的行数和行组数是根据采样百分比得出的。不会从磁盘读取初始步骤中未选择的行组。
在 SQL Server 2019 或更高版本中,可以通过启用全局跟踪标志 11611 跳过主字典构建阶段。
第二种算法始终用于统计构建。它使用真正随机的行级采样,但 I/O 和 CPU 成本较高。它扫描所有段段中的一列并随机选择行的子集。与仅对整个页面进行采样的 B 树和堆相比,这可以生成更准确的直方图。
最终的统计对象将反映所需的采样率。该实现使得这一点比堆或 B 树更难看到,因为在此过程中会读取所有段。