cstore_fdw实现了PostgreSQL的列式存储。列存储非常适合用于数据分析的场景,数据分析的场景下数据是批量加载的。fdw(ForeignDataWrappers)的含义是外部数据包装器。
这个扩展使用了Optimized Row Columnar(ORC)数据存储格式,ORC改进了Facebook的RCFile格式。
优点:
压缩: 将内存和磁盘中数据大小削减到2到4倍。可以扩展以支持不同压缩算法。(官方自测性能也最多就提升了1倍,大多数在10%到50%之间)
列投影: 只提取和查询相关的列数据。提升IO敏感查询的性能。
跳过索引: 为行组存储最大最小统计值,并利用它们跳过无关的行。也就是无法创建索引
下载地址:https://github.com/citusdata/cstore_fdw
# cstore_fdw依赖于protobuf-c对表元数据进行序列化和反序列化
# 安装 protobuf-c-devel(联网下载)
yum -y install protobuf-c-devel
# 解压编译cstore_fdw
# 默认都需要安装gcc,使用root用户
tar -zxvf cstore_fdw-1.6.2.tar.gz
cd cstore_fdw-1.6.2
PATH=/usr/pgsql-10/bin:$PATH make
PATH=/usr/pgsql-10/bin:$PATH make install
# 修改shared_preload_libraries
vi /dbdata/postgresql/data/postgresql.conf
shared_preload_libraries = 'cstore_fdw'
# 重启pg
su - postgres
pg_ctl restart
# 创建扩展和服务器对象
-- load extension first time after install
CREATE EXTENSION cstore_fdw;
-- create server object
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;
# 下载测试数据
wget http://examples.citusdata.com/customer_reviews_1998.csv.gz
wget http://examples.citusdata.com/customer_reviews_1999.csv.gz
gzip -d customer_reviews_1998.csv.gz
gzip -d customer_reviews_1999.csv.gz
# 登录pg
su - postgres
psql
# 创建列存储外部表
-- create foreign table
CREATE FOREIGN TABLE customer_reviews
(
customer_id TEXT,
review_date DATE,
review_rating INTEGER,
review_votes INTEGER,
review_helpful_votes INTEGER,
product_id CHAR(10),
product_title TEXT,
product_sales_rank BIGINT,
product_group TEXT,
product_category TEXT,
product_subcategory TEXT,
similar_product_ids CHAR(10)[]
)
SERVER cstore_server
OPTIONS(compression 'pglz');
# 加载数据到表中
COPY customer_reviews FROM '/home/xuli/customer_reviews_1998.csv' WITH CSV;
COPY customer_reviews FROM '/home/xuli/customer_reviews_1999.csv' WITH CSV;
如果ERROR: cannot copy to foreign table "customer_reviews"尝试运行COPY命令时遇到问题,请再次检查是否已将cstore_fdw添加到shared_preload_librariesin postgresql.conf 并重新启动了Postgres。
# 收集表数据分布统计信息
ANALYZE customer_reviews;
# 卸载扩展之前,首先需要删除所有cstore表
postgres=# DROP FOREIGN TABLE cstore_table_1;
postgres=# DROP FOREIGN TABLE cstore_table_n;
# 删除cstore服务器和扩展名
postgres=# DROP SERVER cstore_server;
postgres=# DROP EXTENSION cstore_fdw;
# cstore_fdw自动在PostgreSQL的数据目录内创建一些目录来存储其文件,需要删除
rm -rf $PGDATA/cstore_fdw
# 删除cstore_fdw shared_preload_libraries在postgresql.conf
vim /dbdata/postgresql/data/postgresql.conf
shared_preload_libraries = '' # (change requires restart)
# 最后,要卸载扩展,您可以在扩展的源代码目录中运行以下命令。这将清除在安装过程中复制的所有文件:
PATH=/usr/pgsql-10/bin:$PATH make uninstall