be_tablets 聚合的表大小和行数与 tables有较大差异,4000多张表中大概有400多张表是不一样的, 有时候be_tablets 查询的表大小和行数都为0,但是tables不是,

为了更快的定位您的问题,请提供以下信息,谢谢
【详述】通过如下sql 查询表的信息,发现问题就是 be_tablets 聚合的表大小和行数与 tables有较大差异,4000多张表中大概有400多张表是不一样的, 有时候be_tablets 查询的表大小和行数都为0,但是tables不是,通过 show partitions 和show tablet 查询发现有分区大小不为0,有tablet大小不为0, 感觉be_tablets 那边数据会慢,对吗?
`
– 计算每个分区的总数据量
WITH partitiondata AS (
SELECT
pm.db_name, – 数据库名称
pm.table_name, – 表名称
pm.partition_name, – 分区名称
pm.replication_num, – 分区副本数 – 一般情况下每个表的副本数是相同的
COALESCE(SUM(tbt.data_size), 0) AS partition_data_size, – 分区大小(多副本)
COALESCE(SUM(tbt.index_disk), 0) AS partition_index_disk, – 分区索引大小(多副本)
COALESCE(SUM(tbt.num_row), 0) AS partition_num_row, – 分区数据量条数(多副本)
COALESCE(SUM(tbt.num_segment), 0) AS partition_num_segment, – 分区 segment 数(多副本)
COUNT(tbt.tablet_id) AS tablet_count, – 统计分区的tablet 数量(多副本)
CASE
WHEN pm.table_name = pm.partition_name THEN 0 – 如果分区名称等于表名称,则不是分区表
ELSE 1 – 否则是分区表
END AS is_partitioned, – 是否是分区表
CASE
WHEN pm.partition_name = ‘$shadow_automatic_partition’ THEN 1 – 如果有这个分区 ,需要在最后给处理一下
ELSE 0 – 否则不是shadow分区
END AS is_shadow_partition – 是否是shadow分区
FROM
information_schema.partitions_meta pm
LEFT JOIN
information_schema.be_tablets tbt
ON pm.partition_id = tbt.partition_id
GROUP BY
pm.db_name,
pm.table_name,
pm.partition_name,
pm.replication_num – 一般情况下每个表的副本数是相同的
),
tablestats AS ( – 计算每个表的总数据量、tablet 数量、最大分区容量和分桶数
SELECT
pd.db_name,
pd.table_name,
SUM(pd.tablet_count) AS tablet_count, – 表的 tablet 数量 (多副本)
SUM(pd.partition_num_row) AS total_num_row, --表总条数(多副本)
SUM(pd.partition_data_size) AS total_data_size, – 表总数据量 – 可以后面加一个 平均每个 tablet 的数据量
SUM(pd.partition_index_disk) AS total_index_disk, – 表总索引大小(多副本)
SUM(pd.partition_num_segment) AS total_num_segment, – 表总 segment 数(多副本)
SUM(pd.is_shadow_partition) AS total_num_shadow_partition, – 表总shadow分区数(多副本)
MAX(pd.partition_data_size) AS max_partition_size, – 最大分区容量
COUNT(DISTINCT pd.partition_name) AS partition_count, – 分区数量
tc.distribute_bucket AS buckets, – 分桶数
pd.replication_num, – 一般情况下每个表的副本数是相同的
pd.is_partitioned – 是否是分区表
FROM
partitiondata pd
JOIN
information_schema.tables_config tc
ON pd.db_name = tc.table_schema
AND pd.table_name = tc.table_name
GROUP BY
pd.db_name,
pd.table_name,
tc.distribute_bucket,
pd.replication_num,
pd.is_partitioned
)
SELECT
ts.db_name, – 数据库名称
ts.table_name, – 表名称
%s AS write_time, – Python 传入日期字符串 CURDATE() - INTERVAL 0 DAY as write_time, – 写入时间(年月日)
ts.tablet_count, – tablet 数量
ts.total_num_row, – 表总条数 (多副本) 真实条数需要除以副本数
ts.total_index_disk, – 表总索引大小 (多副本)
ts.total_num_segment, – 表总 segment 数 (多副本)
ts.total_data_size, – 表总数据量 (多副本,不加索引大小) 真实表大小需要加索引大小
ts.partition_count, – 分区数量
ts.replication_num, – 一般情况下每个表的副本数是相同的
ts.total_num_shadow_partition, – shadow分区数量
tbs.table_catalog, – 表目录 来源 tables 表
tbs.table_type, – 表类型 来源 tables 表
tbs.table_rows, – 表行数 来源 tables 表
tbs.data_length AS table_data_length, – 表数据长度 来源 tables 表
tbs.create_time AS table_create_time, – 表创建时间 来源 tables 表
tbs.update_time AS table_update_time, – 表更新时间 来源 tables 表
CASE
WHEN ts.partition_count > 1 THEN ts.max_partition_size – 分区表显示最大分区容量
ELSE NULL
END AS max_partition_size, – 最大分区容量
ts.buckets, – 分桶数
ts.is_partitioned – 是否是分区表
FROM
tablestats ts
LEFT JOIN
information_schema.tables tbs
ON ts.db_name = tbs.table_schema
AND ts.table_name = tbs.table_name
ORDER BY
ts.tablet_count DESC;

`

【业务影响】
【是否存算分离】 不是存算分离
【StarRocks版本】3.2
【集群规模】3fe(1 follower+2observer)+13be(fe与be非混部)

正常来说be_tablets是实时维护的,记录BE上Tablet的详细信息,而tables它仅仅是一份元数据是有更新频率的。
其实在数据写入、删除或进行 Compaction 操作时,Tablet的统计信息就已经发生了变化。而这些变化也会直接同步和聚合到be_tablets中。但是tables中会通过CBO周期性的统计采集方式进行元数据更新。所以原则上者两者是有一定延迟。

好的,谢谢