功能
information_schema.PERSIST_RANGE_CACHE 用于查看实例持久化范围统计缓存中的内容。TDSQL Boundless 的查询优化器在生成执行计划时,会基于"范围统计(Range Statistics)"对索引扫描的行数进行估算。
PERSIST_RANGE_CACHE 视图展示这部分统计数据中已被持久化保存、可在节点重启后自动恢复的部分,可帮助您:查看实例当前已持久化的范围统计信息。
验证节点重启后范围统计是否成功恢复。
与内存版视图
RANGE_CACHE 对比,确认两者的一致性。持久化范围统计功能由系统变量
range_stat_persist_cache 控制,默认开启。开启后,范围统计信息会被持久化到独立的 RocksDB Column Family 中,节点重启后可自动恢复,无需重新采样。如需关闭该功能,可执行 SET GLOBAL range_stat_persist_cache = OFF。适用版本
TDSQL Boundless 内核版本21.2.6及以上。
字段说明
PERSIST_RANGE_CACHE 视图各字段的含义如下表所示:字段名 | 类型 | 描述 |
TABLE_SCHEMA | varchar(192) | 该范围统计所属表的库名。 |
TABLE_NAME | varchar(192) | 该范围统计所属表的表名。 |
INDEX_NAME | varchar(192) | 该范围统计所属索引名;主键统计显示为 PRIMARY。 |
RANGE_CACHE_MISS | bigint unsigned | 该字段在 PERSIST_RANGE_CACHE 视图中恒为 0。缓存未命中次数仅对内存版视图 RANGE_CACHE 有意义,持久化层不跟踪实时缓存命中情况。 |
RANGE_CACHE_SAMPLE_ROWS | bigint unsigned | 最近一次完整重建该索引范围统计时,每个采样 SST 数据块的平均行数(采样总行数 / 采样次数 + 1),用于全表行数估算。 |
RANGE_CACHE_REFILL_TS | bigint unsigned | 最近一次该索引整体重建范围统计的时间戳,已格式化为 YYYYMMDDhhmmss 形式的可读数值。 |
START_KEY | varchar(192) | 该范围的起始键(可读字符串形式)。 |
END_KEY | varchar(192) | 该范围的结束键(可读字符串形式)。 |
RANGE_ROWS | bigint unsigned | 该范围 (START_KEY, END_KEY] 内的预估行数。 |
RANGE_ACC_ROWS | bigint unsigned | 累计行数估算:从该索引最小键起累加至 END_KEY 的总预估行数,用于跨范围的累加估算。 |
RANGE_TIMESTAMP | bigint unsigned | 该具体范围统计生成的时间戳,已格式化为 YYYYMMDDhhmmss 形式的可读数值。 |
说明:
PERSIST_RANGE_CACHE 与 RANGE_CACHE 的列结构完全一致,区别仅在于数据来源:RANGE_CACHE:当前节点内存中缓存的 range 统计信息。PERSIST_RANGE_CACHE:已持久化保存、全量的范围统计信息,可在节点重启后自动恢复。内存版 RANGE_CACHE 受限于缓存最大容量,仅保存其中一部分。持久化功能由系统变量 range_stat_persist_cache 控制,默认开启。注意事项
持久化范围统计功能由系统变量
range_stat_persist_cache 控制,默认为开启状态(ON)。可通过 SET GLOBAL range_stat_persist_cache = OFF 动态关闭,关闭后不会写入新的持久化记录,但已有的持久化数据仍然保留。执行 DDL 操作(如
DROP TABLE、TRUNCATE TABLE、DROP INDEX、DROP PARTITION)时,系统会自动清理对应的持久化范围统计数据。若清理因存储引擎写入停滞而失败,系统会在后台异步重试,不影响 DDL 操作的执行。PERSIST_RANGE_CACHE 视图中的 RANGE_CACHE_MISS 字段恒为 0,该字段仅在内存版视图 RANGE_CACHE 中有实际意义。示例
示例 1:查询某张表的持久化范围统计
SELECT TABLE_SCHEMA,TABLE_NAME,INDEX_NAME,START_KEY,END_KEY,RANGE_ROWS,RANGE_ACC_ROWS,RANGE_TIMESTAMPFROM information_schema.PERSIST_RANGE_CACHEWHERE TABLE_SCHEMA = 'your_db'AND TABLE_NAME = 'your_table'ORDER BY INDEX_NAME, START_KEY;
示例 2:对比内存与持久化范围统计的一致性
一般情况下,内存中的所有 range 统计信息都能在持久化层中找到其对应记录。下面这条 SQL 用于校验一致性,期望返回空结果集:
SELECT *FROM information_schema.RANGE_CACHEWHERE CONCAT(START_KEY, ' ', END_KEY) NOT IN (SELECT CONCAT(START_KEY, ' ', END_KEY)FROM information_schema.PERSIST_RANGE_CACHE);
如果出现非空结果,说明该范围尚未完成持久化(通常发生在重新获取 range 统计信息后的极短时间内),稍后再次执行即可。