统计信息收集最佳实践
说明:目前 DBA 进阶教程的内容暂时对应的是 OceanBase 4.x 社区版本,本小节的架构部分不涉及商业版中 Oracle 模式租户下的内容。社区版和商业版的能力区别详见:官网链接。
为何要收集统计信息
优化器生成和选择最优的执行计划,往往是基于代价来评估的,因此一个执行计划的代价评估的是否准确,对于优化器的计划生成至关重要。
在代价计算的过程中,优化器会根据代价模型和每个算子估算出的行数评估以及各执行计划的代价。在这之中,统计信息扮演了重要的角色。统计信息是否准确直接影响了算子的行数估算,进一步会影响到计划的代价计算和计划的选择。
因此保持统计信息的准确性对于生成好的执行计划至关重要。
统计信息的默认收集策略
统计信息会在每个工作日(周一至周五)22:00 开始收集,最长收集 4 小时;或在每个非工作日(每周六周日)6:00 开始收集,最长收集 20 小时。这些统计信息收集的时间段我们称之为统计信息维护窗口。
在每 个统计信息维护窗口内,优化器会为每个统计信息过期的表/分区重新收集统计信息。默认情况下统计信息过期的判定是一个表/分区上没有收集过统计信息,或表/分区上增删改的数据量超过了上次收集统计信息时行数的 10%。收集统计信息时,默认的收集策略如下:
配置名称 | 含义 | 默认策略 |
---|---|---|
degree | 并行度 | 1 并行度,单线程扫描。 |
method_opt | 列级统计信息的收集策略 | 收集所有列的统计信息,并收集在where条件中出现过且存在数据倾斜列的直方图 |
granularity | 收集颗粒 | 收集分区级的统计信息,并根据结果推导全局级的统计信息。非分区表的情况下直接收集全局级的统计信息。 |
estimate_percent | 采样比例 | 不采样, 通过全表扫描手机统计信息。 |
block_sample | 是否采样块采样 | 不使用块采样,使用行采样。 |
统计信息收集策略配置
采用默认统计信息收集策略对与大多数的表都是适用的,但是在一些特定的场景下不一定能满足业务的场景,需要用户根据业务特点进行适当的配置。常见的场景及配置策略如下: