社区版4.2.0的压缩功能如何生效

【 使用环境 】 测试环境
【 OB or 其他组件 】OceanBase
【 使用版本 】社区版 4.2.0
【问题描述】

  1. 新建压缩分区表,指定BLOCK_SIZE=1048576 ROW_FORMAT=COMPRESSED COMPRESSION=‘zstd_1.0’
  2. 查询 CDB_TAB_PARTITIONS视图,对应COMPRESS为DISABLED,COMPRESS_FOR为NULL,表的磁盘占用相对非压缩也没有降低,压缩功能看起来没有生效。

【复现路径】问题出现前后相关操作
【问题现象及影响】
压缩功能不生效

【附件】

您好,可以查看这个文档看是否有帮助
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221036

这个是Oracle模式的语法,4.2.0社区版我试了会直接报语法错误。
MySQL模式的语法不会报错,但就像上面说的那样没有压缩效果。

可以参考这篇文档:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218988

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, 
  a.svr_port, 
  b.tenant_id, 
  b.table_id;
3 个赞

感谢!按你说的确实查到了压缩信息和表大小 :smiling_face_with_three_hearts:

另外,我再问下,索引压缩的语法是什么呢

索引表会继承主表的压缩相关属性

那二级索引呢

二级索引也是一样的,会继承主表的压缩方法

是否有参数能否取消默认的压缩属性呢,不是一张张表取消这种