ITPub博客

首页 > 数据库 > 国内数据库 > 四个国产数据库的统计信息为什么对不上:TiDB、OceanBase、StarRocks、Doris 实测

四个国产数据库的统计信息为什么对不上:TiDB、OceanBase、StarRocks、Doris 实测

原创 国内数据库 作者:LibreDB 时间:2026-09-22 23:53:40 0 删除 编辑

我们在做一个开源的数据库客户端,要把行数和体积这类读数显示在界面上。同一套读法接到四个国产库上,结果四个样。下面是实测记录,包括两处我们自己写错的地方。

先说一句结论: 这四个库里,没有一个在刚写完数据的时候能马上给你正确的行数。 但它们不给的方式完全不同,误判成「工具不支持」很容易。

测试对象

库 version() 返回 实际版本
TiDB 8.0.11-TiDB-v8.5.1 同左
OceanBase CE 5.7.25-OceanBase_CE-v4.4.2.1 4.4.2
StarRocks 5.1.0(虚构的) 3.3.22-753696f
Apache Doris 5.7.99 4.1.3-rc02

StarRocks 这一条值得单独拎出来: version() 返回的 MySQL 5.1.0 是个不存在的版本,真实构建号只在 current_version() 里。如果你的工具按 version() 做能力判断,会把它当成十几年前的 MySQL 来对待。

行数:四种不给法

TiDB —— 刚灌完数据读 0 行 0 B,不用管它,后台统计追上之后自己就对了。不需要 ANALYZE。

Doris —— 表现和 TiDB 一样是自愈的,但中间我们绕了弯路:插完 2000 行立刻读是 0 行 0 B,我们手动跑了一句 ANALYZE TABLE ... WITH SYNC, 没有任何效果;大约一分钟后数字自己出现了。所以那句 ANALYZE 是白跑的。

StarRocks —— 同样要等后台收集器,但等待时间差得离谱:同一张 5 行的表,在 4.1.4 上等了 45 秒,在 3.3.22 上等了大约 4 分半。中间这段时间界面上就是 0。

OceanBase —— 不自愈,必须手动 ANALYZE TABLE,跑完之后 2000 就是 2000。而且 只能用 MySQL 模式的写法,Oracle 模式那句会被直接拒:

ANALYZE TABLE t COMPUTE STATISTICS;
→ ERROR 1235

体积:Doris 说真话,另外两个说 0

这是 StarRocks 和 Doris 分道扬镳的地方——StarRocks 是 Doris 的分支,但在这件事上不一样。

Doris 的数字是对的:对象面读到 2000 行 / 9.95 KB, SELECT count(*) 的真值就是 2000;表统计读到 10187 字节, SHOW DATA 给的是 9.948 KB。两边能对上。

StarRocks 读到的是硬零。

OceanBase 也是零—— information_schema.TABLES 里 DATA_LENGTH 和 INDEX_LENGTH 都是 0,表、索引、库、存储四个地方全是 0 B。

另外 OceanBase 和 TiDB 有个共同的小坑: 存储统计里会冒出一行 InnoDB。OceanBase 那行写的是 ibdata1:12M:autoextend,大小读数是 N/A——它为了兼容伪造了 innodb_data_file_path 这个变量,后面并没有这个文件。第一次看到会以为自己解析错了。

我们自己写错的两处

第一处, SHOW STATUS LIKE。 概览和健康两个面板原来发的是 SHOW STATUS LIKE '...',在 Doris 的语法里这是个解析错误:

mismatched input 'LIKE'

而不带 LIKE 的裸 SHOW STATUS 是接受的,只是返回零行。两个面板就这么挂了一段时间,我们一开始归到「Doris 不支持」上,其实是我们发错了语句。

第二处,被 NULL 毒化的求和。 StarRocks 的 INDEX_LENGTH 是 NULL,而 Doris 的同一列是实打实的 0。我们在 SQL 里对这两列做 SUM,NULL 把整个和变成了 NULL,于是 StarRocks 的体积永远读 0——不是它先报零我们跟着零,是我们自己把能读到的那部分也弄没了。改成对 NULL 取 0 之后这一段才正常。

这两件事的教训是一样的: 引擎返回「读不到」和引擎返回「就是 0」,在界面上必须长得不一样。 混在一起显示,排查的人会去查错方向。

顺带记几条别的差异

  • TiDB: max_connections 读到 0,那是它的默认值,意思是不限制,不是坏了。 SHOW STATUS 返回 13 行,里面没有 Threads_connected,所以连接数只能显示「未发布」。慢查询面板永远是空的——它的慢日志在 information_schema.SLOW_QUERY 里。
  • Doris:不发布 Uptime,不发布 Threads_connected,也没有 max_connections 变量。所以这三个位置只能写「N/A,未发布」,写 0 就是编数字。
  • StarRocks:没有 information_schema.PROCESSLIST(*Unknown table*),会话面板和健康检查都卡在这一张表上。
  • OceanBase:租户里没有 performance_schema 这个库( ERROR 1049),健康检查过不去。

想请教各位

  1. StarRocks 后台统计 4 分半和 45 秒的差别,是版本差异还是配置能调?
  2. OceanBase 的体积,除了 information_schema.TABLES 还有别的读法吗?
  3. Doris 的 ANALYZE TABLE ... WITH SYNC 在什么情况下才真的同步?我们那次跑了等于没跑。

上面每条都是在文中标注的那个版本上跑出来的,版本换了结论可能就不一样。各位如果在别的版本上读到不同的数,很想知道。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70051429/viewspace-3183533/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2026-09-22

  • 博文量
    1
  • 访问量
    568