mysql 的语法中 编码和压缩是可以分开配置的,比如:
create table xxx row_format = dynamic compression = 'zstd_1.3.8';
其中compression 可以为表配置通用压缩算法, row_format 可以配置表是否开启数据编码。
oracle 语法中只支持通过 compression 语法同时配置数据编码和压缩,比如:
CREATE TABLE table_name COMPRESS FOR ARCHIVE;
可以为建表开启zstd压缩和数据编码。
CDB_TAB_PARTITIONS这张视图的压缩相关字段目前看起来不准确,类似的视图可以参考DBA_PART_TABLES,其中的compress for字段可以打印出通用压缩算法。 也可以通过查询__all_virtual_table表来查询表的压缩和encoding配置。
另外由于数据的多版本存储和存储格式带来的可能的空洞等原因,目前OceanBase没有视图能比较好地描述一张表的磁盘数据大小。__all_virtual_table_mgr存储了LSM-tree中更细粒度的空间相关的元数据, 在完成一次数据的合并(Major Compaction)后,可以用如下sql来查询对应表的磁盘数据大小。
SELECT
a.svr_ip,
a.svr_port,
b.tenant_id,
b.table_id,
count(a.tablet_id) as tablet_count,
sum(a.size) as size
FROM
__all_virtual_table_mgr a
INNER JOIN __all_virtual_tablet_to_ls b ON b.tenant_id = a.tenant_id
AND b.ls_id = a.ls_id
AND b.tablet_id = a.tablet_id
WHERE
table_type != 0
and b.table_id in (
select
table_id
from
__all_virtual_table
where
table_name = $table_name
)
group by
a.svr_ip,