介绍影响 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 个赞
张雨齐
#2
做一次合并,速度就上来了。
我测试的时候,合并前后做count(*)速度差很多
1 个赞
张雨齐
#4
合并触发
合并触发有三种触发方式:自动触发、定时触发与手动触发。
- 当集群中任一租户的 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
其实就是大数据量的聚合运算,先考虑覆盖索引,要是效果不满意就加并行。