一、cstore_fdw的简介

  https://github.com/citusdata/cstore_fdw,此外部表扩展是由citusdata公司开发,使用RC_file格式对数据进行列式存储。

  

  优点1:因为有压缩,所以在disk上的存储大大减少,压缩比能达到2-4倍

  优点2:数据内部分块存储,对于块数据进行了max以及min值的记录,在查询时能够进行跳块查询

  优点3:在进行查询时,并不是将所有的磁盘数据都load到内存,而是选择列根据记录的skiplist中的offset来load所需要的数据,减少IO

二、安装使用

  安装之前需要安装protobuf & protobuf-c

  [root@centos01 ~]# git clone https://github.com/citusdata/cstore_fdw.git

  下载好后修改Makefile文件中的pgconfig指定到安装目录下 例如:/usr/local/postgres/bin/pgconfig

  [root@centos01 ~]# make && make install

  配置postgres.conf文件末尾添加:

  shared_preload_libraries = 'cstore_fdw'

  启动数据库:

  [postgres@centos01 ~]$ pg_ctl -D db1 -l logfile start -m fast

  [postgres@centos01 ~]$ psql

  

postgres=# create extension cstore_fdw;
CREATE EXTENSION
postgres=# create server cstore_server foreign data wrapper cstore_fdw ;
CREATE SERVER
postgres=# CREATE FOREIGN TABLE customer_reviews
postgres-# (
postgres(# customer_id TEXT,
postgres(# review_date DATE,
postgres(# review_rating INTEGER,
postgres(# review_votes INTEGER,
postgres(# review_helpful_votes INTEGER,
postgres(# product_id CHAR(10),
postgres(# product_title TEXT,
postgres(# product_sales_rank BIGINT,
postgres(# product_group TEXT,
postgres(# product_category TEXT,
postgres(# product_subcategory TEXT
postgres(# )
postgres-# SERVER cstore_server
postgres-# OPTIONS(compression 'pglz');

  PG原生表占用磁盘大小:

postgres=# insert into customer_reviews select * from customer;
INSERT 0 176774
postgres=# select pg_relation_size('customer');
pg_relation_size
------------------
145489920
(1 row)

  经过cstore_fdw外部扩展压缩后占用的磁盘大小:

[postgres@centos01 13056]$ ll /home/postgres/db1/cstore_fdw/13056

-rw------- 1 postgres postgres 6236569 Dec 5 10:07 278237
-rw------- 1 postgres postgres 56 Dec 5 10:07 278237.footer

  对比后磁盘使用减少了很多!!

三、源码分析

postgres中外部表的实现相当于一个引擎,通过挂接C语言的函数指针实现

Datum
cstore_fdw_handler(PG_FUNCTION_ARGS)
{
FdwRoutine *fdwRoutine = makeNode(FdwRoutine); fdwRoutine->GetForeignRelSize = CStoreGetForeignRelSize;
fdwRoutine->GetForeignPaths = CStoreGetForeignPaths;
fdwRoutine->GetForeignPlan = CStoreGetForeignPlan;
fdwRoutine->ExplainForeignScan = CStoreExplainForeignScan;
fdwRoutine->BeginForeignScan = CStoreBeginForeignScan;//1
fdwRoutine->IterateForeignScan = CStoreIterateForeignScan;//2
fdwRoutine->ReScanForeignScan = CStoreReScanForeignScan;//3
fdwRoutine->EndForeignScan = CStoreEndForeignScan;//4
fdwRoutine->AnalyzeForeignTable = CStoreAnalyzeForeignTable;
fdwRoutine->PlanForeignModify = CStorePlanForeignModify;//5
fdwRoutine->BeginForeignModify = CStoreBeginForeignModify;//6
fdwRoutine->ExecForeignInsert = CStoreExecForeignInsert;//7
fdwRoutine->EndForeignModify = CStoreEndForeignModify;//8 PG_RETURN_POINTER(fdwRoutine);
}

  1、2、3、4构成了查询操作 例如: select * from customer_reviews;

  5、6、7、8构成了插入操作 例如:insert into customer_reviews select * from customer;

  特别注意的是在插入的时候,由于CStorePlanForeignModify这个函数中判断了tableEntry->rtekind == RTE_SUBQUERY,

  因此 insert into xx values xxx 这种插入是不支持的。

  从源码中观察到在CStoreEndForeignModify中会进行flushstripe操作,就是不管插入一条数据还是批量插入数据,都会进行flushstripe操作

  如果插入一条数据,则此条数据占用了一个条带的磁盘空间

  如果是批量插入,则按照默认的条带大小,块大小来进行分割,满足stripe了就刷磁盘,接着剩余不满足stripe的作为另外一个条带,如果按照一条数据一个条带的话,查询load数据就会相当缓慢。

  最后得出结论:对于总是进行单条插入或者交易型数据库,这种压缩效率就不是很明显了,如果对于批量插入的话,压缩比例还是很可观的,而且查询也会较快。

  RCFile格式对比orc格式:

  还有就是对于RCfile这种格式,字符串类型的压缩并没有很明显的处理,不像orc格式,orc带有字典压缩处理,而RCFile并没有

  https://github.com/gokhankici/orc_fdw

  这个外部表扩展仅仅对orc格式的文件进行读操作,并没有写操作,写文件的操作是使用java语言开发的。

cstore_fdw的安装使用以及源码分析的更多相关文章

  1. python apschedule安装使用与源码分析

    我们的项目中用apschedule作为核心定时调度模块.所以对apschedule进行了一些调查和源码级的分析. 1.为什么选择apschedule? 听信了一句话,apschedule之于pytho ...

  2. angular源码分析:angular源代码的获取与编译环境安装

    一.安装git客户端 1.windows环境推荐使用TortoiseGit. 官网地址:http://tortoisegit.org 下载地址:http://tortoisegit.org/downl ...

  3. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  4. DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用

    CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...

  5. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  6. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  7. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  8. angular源码分析:angular中的依赖注入式如何实现的

    一.准备 angular的源码一份,我这里使用的是v1.4.7.源码的获取,请参考我另一篇博文:angular源码分析:angular源代码的获取与编译环境安装 二.什么是依赖注入 据我所知,依赖注入 ...

  9. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

随机推荐

  1. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  2. <JavaScript语言精粹>--<读书笔记三>之replace()与正则

    今天有人问我repalce(),他那个题目很有意思.我也不会做,于是我就去查,结果发现就是最基础的知识的延伸. 所以啊最基础的知识才是很重要的,千万不能忽略,抓起JS就写代码完全不知到所以然,只知道写 ...

  3. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

  4. PHP_环境配置_python脚本_2017

    Apache配置 需要安装:VC2015 httpd-2.4.16-win32-VC14.zip VC14就是2015的环境. 又比如:php-5.6.12-Win32-VC11-x86 VC11就是 ...

  5. 如何修复VUM在客户端启用之后报数据库连接失败的问题

    在上一篇随笔中介绍了关于重新注册VMware Update Manager(VUM)至vCenter Server中的方法,最近有朋友反应,原本切换过去好好的更新服务为什么某次使用一下就不灵了? 当时 ...

  6. 计算机网络学习笔记--数据链据层之MAC子层(整理)

    概述: 为什么需要介质访问控制子层(MAC)? 介质访问控制子层(MAC)是局域网体系结构中划分的子层,多路访问链路采用共享介质连接所有站点.发送站点通过广播方式发送数据并占用整个带宽,如果有多个站点 ...

  7. 跟我学习NHibernate (1)

    引言:Nibernate概述 NHibernate是一个ORM框架,NHibernate是一个把C#对象世界和关系世界数据库之间联系起来的一座桥梁.NHibernate 能自动映射实体模型到数据库,所 ...

  8. 用eclipse开发项目时遇到的常见错误整理,和配套解决方案(1)

    01. MyEclipse项目导入eclipse后,怎么发布不了? 今天导入了之前的一个MyEclipse项目,更改jdk后,发现发布不了.解决方案如下: 打开项目根目录,找到.settings文件夹 ...

  9. HTML基本元素(三)

    1.HTML特殊字符 一些字符在HTML中拥有特殊的含义,比如小于号(<)和大于号(>)用于定义HTML标签.如果我们希望浏览器正确地显示这些字符,我们必须在HTML源码中插入字符实体. ...

  10. TeamCity : Build 版本控制系统配置

    VCS (版本控制系统) 是用来跟踪项目源文件版本变化的系统.它还有其它的名字,比如 SCM(源代码管理).当前 TeamCity 内置支持的 VCS 类型有:Git, Subversion, Mer ...