代码改变世界

SQL Server数据库直方图能设置阶梯数吗?

2025-03-25 15:59  潇湘隐者  阅读(10)  评论(1编辑  收藏  举报

SQL Server数据库直方图可以设置阶梯数(steps)吗? 有些文章翻译为步长,其它数据库中又称为桶数(buckets),这些只是不同的名称概念而已. 先说结论,在SQL Server数据库中无法干预或设定直方图的步长/阶梯数量. 另外, SQL Server数据库的直方图有点比较奇怪,它没有类型或者说不区分类型。像Oracle直方图分为Frequency直方图,Height Balanced直方图, Top-Frequency直方图,Hybrid直方图.而SQL Server的直方图没有任何分类(至少到目前为止还没有不同类型的直方图,也暂未在官方文档中看到有这方面的介绍),其实这些还不是我关注的点,我关注点为SQL Server直方图无法设置直方图的步数(steps)/梯级数. 因为其它数据库是可以设定的.像Oracle/MySQL都可以在创建统计信息时指定直方图的步数/阶梯数/桶数.

MySQL

MySQL通过设置系统变量innodb_stats_buckets来设定直方图的桶数,设置后需要重新分析表以更新统计信息。 innodb_stats_buckets的默认值是100,取值范围是1到1000。设置后,需要重新分析表。

Oracle

在Oracle数据库中,可以通过DBMS_STATS包来设置直方图的步数。

如下所示,一般是在参数method_opt中设置直方图的桶数(histogram buckets)

DBMS_STATS.GATHER_TABLE_STATS(
   ownname => '模式名',
   tabname => '表名',
   method_opt => 'FOR ALL COLUMNS SIZE  桶数 | AUTO | REPEAT | SKEWONLY'
);

例子如下:

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => 'HR',
    tabname => 'EMPLOYEES',
    method_opt => 'FOR ALL COLUMNS SIZE 254'
  );
END;
/

Oracle 11g 及之前版本,Bucket的数量不超过254,而从Oracle 12c开始直方图的桶数(histogram buckets)的取值范围为[1,2048]

SQL Server

SQL Server直方图的步数(steps)最大值为200,而且无法像其它数据库那样自定义直方图的步数(Steps)。它应该有内部的一些算法与逻辑,但是因为公开的资料不多(几乎等同于没有),所以无法探究。根据一些简单测试,直方图的步数(steps)的多少,跟统计信息的采样比例有点联系,统计信息以不同的比例采样时,你会发现直方图的步数/阶梯数会变化。