OceanBase 4.x 分区表统计信息过期,导致查询计划突然变差,如何排查和规避?

环境:OceanBase 4.2.x(或你的实际版本),集群模式(或单机),MySQL 模式。

有一张按天分区的业务表,约 300 个分区,总数据量 5 亿左右。现象是:白天业务低峰期查询正常,但到了数据写入高峰后,部分查询的执行计划突然从走索引变成全表扫描,响应时间从毫秒级涨到几秒。

初步排查:

  • EXPLAIN 看执行计划,发现估算行数和实际行数偏差很大;
  • DBA_TAB_STATISTICS 里统计信息的上次收集时间是比较久以前;
  • 手动 ANALYZE TABLE 后计划恢复正常,但过一段时间又复发。

想请教:

  1. OceanBase 的统计信息收集机制和 Oracle 差异较大,自动收集默认是开启的吗?触发条件是什么?
  2. 对于分区表,有没有办法只收集“有数据变化”的分区的统计信息?还是只能全表 ANALYZE
  3. 如果自动收集不及时,通常用什么方案补充?比如自定义定时任务 + DBMS_STATS
  4. 有没有参数可以控制统计信息的“新鲜度”阈值,避免计划频繁抖动?

希望有 OB 运维经验的朋友指点一下,谢谢。

  • ANALYZE 支持分区级统计信息收集

  • 看场景这张表类似buffer表,可以开表级别自适应合并试试