基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
收集统计信息前的计划为何会不稳定?
更新时间:2024-07-16 07:16
问题解答
如果从来没有收集过统计信息,为了生成更好的计划,优化器会对表中的数据进行动态采样。
动态采样是在计划生成阶段针对数据库对象进行提前采样,通过采样的方式进行行数估计,从而用于代价模型中。
因为动态采样过程中,每次采样的样本数据块有一定的随机性,所以即使表中的数据没有变化,动态采样的结果也可能不同,因此可能会生成不同的计划。
问题举例
以下以一个没收集统计信息导致的计划不稳定的示例进行说明。
环境信息: 三 Zone 三副本,各个副本的 leader 打散在三个分区上。
表定义:一张三十个分区的分区表,上面有三个索引,一个没有分区的 global index,两个和主表一样有三十个分区的 local index 。
如果没有统计信息,根据不同的动态采样结果,显而易见,可能会出现两种计划。
第一种情况下,走
I_update_time这个 local index,好处是可以利用这个索引的有序性,优化 ORDER BY update_time DESC 排序的动作,消除各个分区内的排序(三号算子的 top n sort 不需要真正进行 sort,只需要做 top n 就够了),计划如下所示:
第二种情况下,走
unique_did_uuid这个 global index,好处是满足did = ?这个过滤条件的数据,可以在索引上被快速定位,计划如下所示:
假设根据真实测试数据的数据特征,应该选择第二种计划。
因为没有统计信息,所以优化器只能根据动态采样得来的部分数据,算出这两种计划的代价,然后生成代价更低的计划。即使表中的数据没有发生过变化,因为每次动态采样的数据因为有一定的随机性,会采样到不同的数据,所以可能导致生成的计划不稳定。
如果采样到一批比较极端的不能代表整体数据特征的数据,就会导致生成不优的计划。例如可能会生成第一种走
I_update_time这个 local index 的计划。
如果采样的数据比较合适,就会生成第二种走
unique_did_uuid这个 global index 的计划。
说明
关于动态采样的详细介绍,参见 优化器动态采样
适用版本
OceanBase 数据库 V4.2.x 及之后版本。