ob数据库大表行数统计

有什么办法快速又准确的获取大表行数吗?除了并发count。

1 个赞

我知道的:

  1. 统计信息,是快但是不准。
  2. count,是准但是慢。
  3. htap列存。
  4. 程序双写redis中,定期同步,日常查redis。

在AP场景,count与数据量无关与统计信息无关(起不到多大优化可以忽略),不管是100亿还是10000亿行,正常不超过0.1s,自己可以测试一下就知道。

@论坛小助手

根据文档库中的信息,OceanBase 数据库提供了多种方式来获取表的行数统计信息。除了直接使用 COUNT(*) 进行并发统计外,还可以通过以下方法快速且准确地获取大表的行数:

1. 使用统计信息

OceanBase 数据库支持通过收集统计信息的方式间接获取表的行数。统计信息中包含表的行数估计值,虽然不是实时精确值,但在大多数场景下已经足够准确。

收集统计信息

可以通过以下方式手动收集统计信息:

-- 使用 DBMS_STATS 包收集统计信息
EXECUTE DBMS_STATS.GATHER_TABLE_STATS('schema_name', 'table_name');

-- 或者使用 ANALYZE 语句
ANALYZE TABLE table_name;

查询统计信息

收集完成后,可以通过查询系统表 __all_table 获取表的行数估计值:

SELECT row_count FROM __all_table WHERE table_name = 'your_table_name';

依据: 手动收集统计信息


2. 使用物化视图

如果需要更精确的行数统计,可以创建一个物化视图来定期刷新表的行数统计结果。

创建物化视图

CREATE MATERIALIZED VIEW mv_row_count AS SELECT COUNT(*) AS total_rows FROM your_table_name;

查询物化视图

SELECT total_rows FROM mv_row_count;

这种方式可以在一定程度上减少频繁执行 COUNT(*) 的性能开销。


3. 利用分区表特性(如果适用)

如果表是分区表,可以通过查询分区元数据来快速估算总行数。OceanBase 数据库会为每个分区维护行数统计信息。

查询分区行数

SELECT SUM(row_count) AS total_rows 
FROM __all_virtual_partition_info 
WHERE table_id = (SELECT table_id FROM __all_table WHERE table_name = 'your_table_name');

依据: 阅读和管理 OceanBase 数据库 SQL 执行计划


4. 使用增量统计工具

对于非常大的表,可以考虑使用 OceanBase 提供的增量统计工具或外部 ETL 工具(如 Flink)来定期更新行数统计信息,并将其存储在单独的汇总表中。


总结

  • 如果对精度要求不高,推荐使用 统计信息
  • 如果需要更高的精度,可以考虑 物化视图分区表特性
  • 对于超大规模表,建议结合 增量统计工具ETL 流程 来优化行数统计过程。

以上方法均能有效减少直接执行 COUNT(*) 带来的性能开销,同时提供较为准确的行数统计结果。

更多信息请查看:

  1. 表存储
  2. 阅读和管理 OceanBase 数据库 SQL 执行计划
  3. 使用 Superset 和 OceanBase 进行数据分析
  4. OceanBase 集群运维管理之用户实操
  5. 并发控制概述
  6. 手动收集统计信息
  7. OceanBase AP 概述
  8. 收集统计信息概述
  9. 基于 Superset 对 OceanBase 数据库进行数据分析
1 个赞