分析引擎默认会依据表的主键对数据进行重新组织,并转换为列式存储格式保存到列存节点中。这种存储方式可显著提升基于主键的查询效率以及过滤场景的扫描效率。然而,如果业务查询大多依赖其他字段进行过滤或排序,则基于主键的排序机制可能无法充分发挥性能优势。在这种情况下,可通过调整列存表的排序键来进一步优化 SQL 查询效率。典型的如 SaaS 类业务场景,在业务中常有基于租户 ID 进行过滤查询的场景,就可以将租户 ID 作为排序键。
注意:
目前仅分析引擎内核版本为2.2410.11.1与3.2503.4.0及之后的版本可以自定义列存排序键。
自定义列存排序键会导致同步暂停,建议在业务低峰期进行操作。
不支持自定义列存排序键的场景
自定义列存排序键必须包含主键字段。分析引擎会判断是否包含主键,如果不包含,则会隐式地为排序键加上主键字段。
不支持 float,double,longtext,blob,boolean,json 等列作为自定义排序键。
不支持无主键表自定义列存排序键。
对表自定义列存排序键之后,如果对排序键列执行了 DDL 操作(drop column、modify column、rename column、change column、drop primary key),则会导致此列存表的同步中断。例如排序键修改为了“id,c1,c2”,如果在主节点中对 id,c1,c2这三列执行以上操作就会出现同步中断问题。
自定义列存排序键最多包含八个字段列。
暂不支持中文列名和包含特殊字符的列作为排序键。
操作步骤
通过 create 语句创建自定义列存排序键表
在 COMMENT 中添加 order_key=column1,column2 信息即可,需要与其他注释通过空格分开。
CREATE TABLE 表名 (...) COMMENT 'order_key=column_name[,column_name]';## 举例:CREATE TABLE part (p_partkey BIGINT NOT NULL PRIMARY KEY,p_name VARCHAR(55) NOT NULL,p_mfgr CHAR(25) NOT NULL,p_brand CHAR(10) NOT NULL,p_type VARCHAR(25) NOT NULL,p_size BIGINT NOT NULL,p_container CHAR(10) NOT NULL,p_retailprice DECIMAL(15,2) NOT NULL,p_comment VARCHAR(23) NOT NULL) COMMENT '零件的信息表 order_key=p_brand,p_container,p_type';
通过 alter 语句修改表的排序键
对于已经数据导入完成的表格,需要为表设置自定义列存排序键,可以通过 ALTER 语句为表添加自定义列存排序键,语法如下:
ALTER TABLE table_name COMMENT 'order_key=column_name[,column_name]';## 举例:ALTER TABLE part COMMENT '零件信息表 order_key=p_brand,p_container,p_type';
如何确认排序键修改成功
当前暂无法支持查看排序键的调整进度,但在排序键调整的过程中,依然可针对表数据进行查询。排序键调整过程中会暂停数据同步,您可以通过观测同步延迟以确认是否完成排序键修改。
不规范的排序键语法
排序键中包含重复的列名:
ALTER TABLE part COMMENT '零件的信息表 order_key=p_partkey,p_type,p_partkey COLUMNAR=1';
指定不存在的列作为排序键
ALTER TABLE part COMMENT '零件的信息表 order_key=column';
关键字错误
ALTER TABLE part COMMENT '零件的信息表 ORDERKEY=column';
与其他 COMMENT 信息不加空格区分:
ALTER TABLE part COMMENT '零件的信息表order_key=p_partkey';
连续使用多个排序键关键字:
ALTER TABLE part COMMENT '零件的信息表 order_key=p_partkey order_key=p_partkey';
排序键关键字为空:
ALTER TABLE part COMMENT '零件的信息表 order_key= COLUMNAR=1';