直方图是一种特殊的列统计信息。默认情况下,优化器会认为列的数据是分布均匀的,会根据这一特征来进行行数估计,但是在真实的场景中,大多数表的数据分布都是不均匀的,这就会导致优化器错误的估计行数而选择不到最优的执行计划,这种场景下就需要有直方图。直方图通过将数据保存到一系列有序的桶中来描述其列的整体数据分布特征,优化器可以依据直方图来估算出更准确的行数。其中直方图每一个桶中包含了如下的信息:
- 当前桶累积的数据量(包含当前桶及其之前的桶的总和);
- 当前桶结束的value值;
- 当前桶结束的value值的出现频次;
目前 OceanBase 优化器支持三种类型的直方图:频率直方图、TopK直方图和混合直方图。优化器在收集统计信息的时候会根据列数据的真实分布情况来选择合适的直方图类型。
有关直方图的更多介绍,可参考文档 直方图。
本文主要介绍,如何获取表的直方图。
所有表的直方图都是存放在 oceanbase 库的 histogram 相关表中,需要收集统计信息的时候收集带直方图的才行,可以用 owner 和 table_name 来筛选,具体示例如下:
select * from oceanbase.dba_tab_histograms where owner = ‘tpch’ and table_name = ‘lineitem’;
补充知识
可通过如下方式收集直方图信息:
obclient> call dbms_stats.gather_table_stats(‘tpch’,‘lineitem’,degree=>8,method_opt=>‘for all columns size 254’);
适用版本
OceanBase 数据库所有版本。