在海量数据统计、多维分析类业务场景中,传统行存储往往存在扫描量大、IO 消耗高的性能瓶颈。GBase(gbase database) 提供 INMEMORY 列存存储能力,通过列式数据组织形式显著提升聚合、分组、排序等分析类查询效率。下文为官方完整列存存储使用文档,涵盖建表语法、属性修改、查询规则、参数配置、系统表等全部核心内容,供开发与运维人员查阅使用。
列存存储
列存定义
--创建t1表,表属性指定为列存 CREATE TABLE t1( a int, b int, c int) INMEMORY; --创建t2表,表属性指定为列存,c指定为非列存 CREATE TABLE t2( a int, b int,c int) INMEMORY INMEMORY(a,b) NO INMEMORY(c); --创建t3表,表属性指定为非列存,a,b指定为列存 CREATE TABLE t3( a int, b int,c int) NO INMEMORY INMEMORY(a,b) ; --创建t4表,不指定表的列存属性,c指定为非列存,a,b指定为列存 CREATE TABLE t4( a int, b int,c int) INMEMORY(a,b) NO INMEMORY(c);修改列存属性
--修改t1表为非列存表 ALTER TABLE t1 NO INMEMORY; --修改t2表a字段为非列存 ALTER TABLE t2 NO INMEMORY(a); --修改t3表a,b为非列存,c为列存 ALTER TABLE t3 INMEMORY(c) NO INMEMORY(a,b);列存表强制同步
ALTER TABLE table_name FORCE INMEMORY;列存查询支持场景
带聚合函数的查询 带包含order by, group by, olap函数,聚合函数等至少一种分析算子的查询 如SELECT c4, COUNT(c1), AVG(c7) FROM t1 WHERE c10 > '2025-01-01 08:00:00' GROUP BY c4;
参数 / HINT 强制查询 参数 INMEMORY_QRY 配置为2(如 onmode -wf INMEMORY_QRY = 2) 使用 INMEMORY HINT(如 SELECT /*+ INMEMORY */ * FROM 表名;) 查询界面无法知道语句是否执行了INMEMORY查询,可以通过查看执行计划中的Query Statistics,如果为memqry则为列存查询。
QUERY: (OPTIMIZATION TIMESTAMP: 11-18-2025 17:30:15) ------ select sum(c1) from t1 ? Estimated Cost: 2 Estimated # of Rows Returned: 1 ? 1) gbasedbt.t1: SEQUENTIAL SCAN ? ? Query statistics: ----------------- ? Table map : ---------------------------- Internal name Table name ---------------------------- ? type rows_prod est_rows time est_cost ------------------------------------------------- memqry 1 0 00:00.00 0相关参数配置
列存相关的配置参数位于$GBASEDBTDIR/etc/onconfig.servername(servername为实例名后缀),配置方式参考如下:
| INMEMORY | 0 关闭列存功能1 为默认值,打开列存功能 | 1.修改配置文件重启数据库服务 |
|---|---|---|
| INMEMORY_QRY | 0 数据库不进行列存查询1 只有符合要求且存在olap分析算子(order by/group by/olap函数/聚合函数)的查询语句进行列存查询2 强制进行列存查询 | 1.修改配置文件重启数据库服务2.动态设置onmode -wf INMEMORY_QRY=1 |
| INMEM_MEM_LIMIT | INMEMORY的内存大小限制 | 1.修改配置文件重启数据库服务2.set environment inmemory memlimit '4G'; |
| INMEM_TEMPDBS | INMEMORY的临时磁盘空间大小限制 | 1.修改配置文件重启数据库服务2.set environment inmemory tempdbs '50G'; |
| INMEM_THREADS | 列存线程数 | 1.修改配置文件重启数据库服务 |
| INMEM_TEMPDBS_PATH | 配置临时空间目录,默认值修改为 $GBASEDBTDIR/tmp | 1.修改配置文件重启数据库服务 |
可以使用以下命令查询当前INMEMORY内存和磁盘使用情况:
info?inmemory;系统表
sysmaster库下新增系统表sysinmemory,用于保存表的列存相关属性。
| 列 | 类型 | 解释 |
|---|---|---|
| database | char(128) | 数据库 |
| owner | nchar(32) | 所属者 |
| tabname | nvarchar(128,0) | 表名 |
| tabid | serial | 表ID |
| objname | nvarchar(128,0) | 对象名 |
| objtype | char(1) | 对象列存类型objtype为”T”表示该行记录为列存,若为”C”则表示列存表中开启列存功能列的信息。 |
| objpartn | integer | 表的物理存储位置 |
| objcolno | smallint | 列存列的列号 |
| objcoltype | smallint | 列存列类型 |
| objcollen | integer | 列存列长度 |
本文完整收录 GBase INMEMORY 列存存储原生文档内容,覆盖建表、属性变更、查询校验、参数调优、系统表查询全流程操作。大家在报表、离线分析等 OLAP 场景开发时,可直接参考文中 SQL 语法与参数配置;若实操中遇到列存未生效、内存资源不足、执行计划无 memqry 标识等问题,欢迎在社区留言交流,后续会持续更新相关排错经验与优化案例。