PostgreSQL 9.5 new feature - Writing A Custom Scan Provider

less than 1 minute read

背景

PostgreSQL 9.5 开放了自定义数据扫描的接口,允许用户自定义扫描方法。

PostgreSQL默认提供的扫描方法可以从参数配置中看出:

#enable_bitmapscan = on  
#enable_hashagg = on  
#enable_hashjoin = on  
#enable_indexscan = on  
#enable_indexonlyscan = on  
#enable_material = on  
#enable_mergejoin = on  
#enable_nestloop = on  
#enable_seqscan = on  
#enable_sort = on  
#enable_tidscan = on  

或者你可以参考:

src/backend/optimizer/util/pathnode.c

src/backend/executor

以上扫描方法已经比较全了,那么什么情况下会用到自定义数据扫描接口呢?

例如:

1. 数据库一体机厂商,他们在存储方面可能有比较独特的访问方法可以提高性能,并且PG默认的扫描方法无法满足。

2. 又如,我们在数据库中使用了二级缓存(如redis),那么也可以通过自定义扫描方法来利用redis提高数据访问速度。

3. 或者我们可以自定义并行扫描的方法来提高扫描效率,例如并行查询,创建索引,利用现有索引重建索引等。

4. 或者通过O_DIRECT flag来定义绕过操作系统缓存的扫描方法。

5. 自定义索引跳跃扫描方法来提高稀疏数据的count(distinct )或count() group by 的效率等等。

定义方法参考

http://www.postgresql.org/docs/devel/static/custom-scan.html

必须实现三个主要步骤,创建路径,创建执行计划,执行执行计划。

Implementing a new type of custom scan is a three-step process. First, during planning, it is necessary to generate access paths representing a scan using the proposed strategy. Second, if one of those access paths is selected by the planner as the optimal strategy for scanning a particular relation, the access path must be converted to a plan. Finally, it must be possible to execute the plan and generate the same results that would have been generated for any other access path targeting the same relation.

显然,开放自定义扫描方法,在减少社区开发压力的情况下,给社区带来了无限可能。

未来可能会有HACKer放出自定义扫描方法的插件,拭目以待吧。

9.5 release前可能会在contrib里面新增一个范例插件。

参考

1. http://www.postgresql.org/docs/devel/static/custom-scan.html

2. pgstrom是一个基于CUDA写的custom scan provider。用于GPU加速多表关联。

Flag Counter

digoal’s 大量PostgreSQL文章入口