Cstore_fdw 是 Citus Data 开发的一款开放源码的列存扩展插件。列存储在数据批量导入的分析场景能够提供更好的性能。Cstore_fdw 通过只读取磁盘上相关的列数据来提升性能,同时,由于每列的数据来自同一个域,因此更利于数据压缩,cstore_fdw 提供 6~10 倍的数据压缩能力,从而减小了对磁盘存储的需求。
Cstore_fdw 采用 Optimized Row Columnar (ORC) 格式作为其数据的物理存储格式。ORC 优化了 Facebook 的 RCFile 存储格式,并具有以下优点:
KingbaseES中通过cstore_fdw插件来实现列式存储及压缩。
在使用 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 外部表的时候指定:
cstore_fdw 提供了两种方式用于向其导入数据:
我们可以使用 ANALYZE 命令收集列存表的统计信息,从而帮助优化器选择最优的查询计划。
-- 安装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。
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目录下,新库使用新文件,这里要注意,由于是连接,新旧文件相互影响。