当前位置: 首页 > 工具软件 > cstore_fdw > 使用案例 >

金仓数据库 KingbaseES 插件cstore_fdw

段干庆
2023-12-01



1. cstore_fdw插件介绍


Cstore_fdw 是 Citus Data 开发的一款开放源码的列存扩展插件。列存储在数据批量导入的分析场景能够提供更好的性能。Cstore_fdw 通过只读取磁盘上相关的列数据来提升性能,同时,由于每列的数据来自同一个域,因此更利于数据压缩,cstore_fdw 提供 6~10 倍的数据压缩能力,从而减小了对磁盘存储的需求。
Cstore_fdw 采用 Optimized Row Columnar (ORC) 格式作为其数据的物理存储格式。ORC 优化了 Facebook 的 RCFile 存储格式,并具有以下优点:

  • 压缩 (Compression) - 大约减少了 2~4 倍的内存和磁盘存储空间。易于扩展以支持不同的编码。
  • 列投影 (Column Projections) - 仅仅读取与该查询有关的数据列,提高了 I/O 效率。
  • 跳跃索引 (Skip Indexes) - 为每个行组 (Row Groups) 存储其最大值和最小值,并利用他们来跳过不相关的数据行。

KingbaseES中通过cstore_fdw插件来实现列式存储及压缩。

 

2. 使用


在使用 cstore_fdw 之前,需要将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启 KingbaseES 数据库。
shared_preload_libraries [color=var(--highlight-operator-color)]= [color=var(--highlight-string-color)]'cstore_fdw' # (change requires restart)
以下四个选项可以在创建 cstore 外部表的时候指定:

  • filename (可选) - 存放列存表数据的绝对路径,如果没有指定该选项,那么 cstore_fdw 则采用默认的 $PGHOME/cstore_fdw 来存储列存表数据。如果为该参数指定了值,则使用该值作为前缀来存储列存表数据信息。例如,当指定的 filename 值为 /cstore_fdw/my_table,那么 cstore_fdw 将使用 /cstore_fdw/my_table 来存储列存表用户数据,同时,使用 /cstore_fdw/my_table.footer 来存储列存表的元数据信息。
  • compression (可选) - 该参数用于指定用户数据的压缩算法,支持 none,pglz,zstd(Zstandard压缩,可通过cstore_fdw.zstd_compression_level设置压缩级别,级别范围:0~9,默认级别:1)和dict(字典压缩)四个值,默认值为 none。
  • stripe_row_count (可选) - 该参数指定每个 stripe 中行记录数,默认值为 150000。该值越小,加载数据或者查询时使用的内存也就越小,相反,其性能也就越低。
  • block_row_count (可选) - 该参数指定每个列数据块 (column block) 中的行记录数,默认为 10000。Cstore_fdw 压缩数据、创建跳跃索引以及磁盘读取时都是以块 (block) 为最小单元。该值越大,则利用数据压缩,并可以减少磁盘读取的次数量,然而,这将影响到跳过不相关的数据块的概率。

cstore_fdw 提供了两种方式用于向其导入数据:

  • 使用 COPY 命令将文件、程序或者标准输入中导入数据;
  • 使用 INSERT INTO cstore_table SELECT ... 语法从其他表导入数据。

我们可以使用 ANALYZE 命令收集列存表的统计信息,从而帮助优化器选择最优的查询计划。

[color=var(--admonition-note-title-color)]Note
  • Cstore_fdw 目前并不支持使用 UPDATE 或 DELETE 命令来对表进行更新。同样,他也不支持单条记录的插入,这是由于每次导入数据都会形成至少一个数据块,若是支持单条记录插入,那么每个 INSERT 命令插入一条记录,将导致数据块过多从而影响性能,为此,Cstore_fdw 不支持单条记录的插入。
  • cstore_fdw 目前不支持创建字段约束。如果在创建cstore外部表示定义了约束,该创建语句不会报错,但约束条件无效。


3. 示例

-- 安装cstore_fdw
CREATE EXTENSION cstore_fdw;
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;

-- 加载参数
LOAD 'cstore_fdw';

-- 查看当前zstd压缩级别参数值
show cstore_fdw.zstd_compression_level;
cstore_fdw.zstd_compression_level
-----------------------------------
1
(1 row)

-- 设置zstd压缩级别
SET cstore_fdw.zstd_compression_level = 3;
show cstore_fdw.zstd_compression_level;
cstore_fdw.zstd_compression_level
-----------------------------------
3
(1 row)

-- 创建无压缩列式存储外部表并指定存储文件
CREATE FOREIGN TABLE contestant (handle TEXT, birthdate DATE, rating INT,
percentile FLOAT, country CHAR(3), achievements TEXT[])
SERVER cstore_server
OPTIONS(filename '/home/test/data/contestant.cstore');

-- 创建基于pglz压缩的列式存储外部表
CREATE FOREIGN TABLE contestant_compressed (handle TEXT, birthdate DATE, rating INT,
percentile FLOAT, country CHAR(3), achievements TEXT[])
SERVER cstore_server
OPTIONS(compression 'pglz');

-- 创建基于zstd压缩算法的列式存储外部表
CREATE FOREIGN TABLE contestant_zstd (handle TEXT, birthdate DATE, rating INT,
percentile FLOAT, country CHAR(3), achievements TEXT[])
SERVER cstore_server
OPTIONS(compression 'zstd');

-- 创建字典压缩算法的列式存储外部表
CREATE FOREIGN TABLE contestant_dict (handle TEXT, birthdate DATE, rating INT,
percentile FLOAT, country CHAR(3), achievements TEXT[])
SERVER cstore_server
OPTIONS(compression 'dict');

-- 导入数据
-- 从文件导入
COPY contestant FROM '/home/test/input/data/contestants.1.csv' WITH CSV;
-- 从程序导入
COPY contestant FROM PROGRAM 'cat /home/test/input/data/contestants.2.csv' WITH CSV;
--从标准输入导入
copy contestant (handle, birthdate, rating, percentile, country, achievements)
from STDIN WITH CSV;
c,1988-11-01,2907,99.4,XB ,"{w,y}"
d,1985-05-05,2314,98.3,XB ,{}
e,1995-05-05,2236,98.2,XC ,{a}
\.

-- 解析
ANALYZE contestant;

--卸载
--卸载cstore_fdw之前,需要删除所有的cstore列存表、server和扩展
DROP FOREIGN TABLE contestant;
DROP FOREIGN TABLE contestant_compressed;
DROP SERVER cstore_server;
DROP EXTENSION cstore_fdw;

Cstore_fdw 会自动的创建目录来存储列存相关的数据,我们可以执行下面的命令来删除:

$ rm -rf $KESDATA/cstore_fdw

上面给出的是 cstore_fdw 的默认路径,若在建表的时候指定了 filename,其位置可能不同。
另外还需要移除kingbase.conf文件中shared_preload_libraries 中的 cstore_fdw。

 

4. 升级


cstore表在使用sys_upgrade工具升级默认行为如下:
传输模式为拷贝(copy)
用户指定filename:在指定文件目录下,拷贝一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。
用户不指定filename,使用默认位置:将旧库的数据目录下的cstroe_fdw目录下的数据文件拷贝到新库数据目录下cstore_fdw目录下,新库使用新文件。
传输模式为克隆(clone)
用户指定filename:在指定文件目录下,克隆一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。
用户不指定filename,使用默认位置:将旧库的数据目录下的cstroe_fdw目录下的数据文件克隆到新库数据目录下cstore_fdw目录下,新库使用新文件。
传输模式为连接(link)
用户指定filename:在指定文件目录下,连接一份与成原文件相同的文件,文件名为加_upg。新库继续使用原文件。这里要注意,由于是连接,upg文件也将随原文件一起变更。
用户不指定filename,使用默认位置:将旧库的数据目录下的cstroe_fdw目录下的数据文件连接到新库数据目录下cstore_fdw目录下,新库使用新文件,这里要注意,由于是连接,新旧文件相互影响。
 

参考资料

更多金仓数据库 KingbaseES 信息,详见 KingbaseES 产品手册

 类似资料: