OceanBase 数据库执行 count(*) 时间的因素以及所短时间的方法是什么?

介绍影响 OceanBase 数据库执行 count(*) 时间的因素以及缩短 count(*) 执行时间的方法。

适用版本

OceanBase 数据库所有版本

执行 count(*) 的时间

OceanBase 数据库中,执行

count(*)

的时间不仅与选择的行数,还与行的长度相关。这是由于对主表的扫描代价与行长度是相关的。

如何缩短 count(*) 的执行时间

如果您希望在更短的时间执行

count(*)

,可以通过以下两个方式进行规避:

  • 在查询中通过 SQL Hint 指定并行度。例如指定并行度为 16。

obclient> SELECT /*+ PARALLEL(16)*/ count(*) FROM $table;

  • 为主表创建一个只包含一行的索引。

  • 例如为

    $table

    id

    列创建索引。

obclient> CREATE INDEX ind ON $table(id);

1 个赞

做一次合并,速度就上来了。
我测试的时候,合并前后做count(*)速度差很多

1 个赞

您好,想请教下 您是怎么合并的

合并触发

合并触发有三种触发方式:自动触发、定时触发与手动触发。

  • 当集群中任一租户的 Minor Freeze 次数超过阈值时,就会自动触发整个集群的合并。
  • 也可以通过设置参数来在每天的业务低峰期定时触发合并。
obclient> ALTER SYSTEM SET major_freeze_duty_time = '02:00';
  • 也通过以下的运维命令手动触发合并。
obclient> ALTER SYSTEM MAJOR FREEZE;

官方介绍
https://www.oceanbase.com/docs/community-observer-cn-10000000000449401

其实就是大数据量的聚合运算,先考虑覆盖索引,要是效果不满意就加并行。