![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PosgresQL 扩展开发
davidzwb
这个作者很懒,什么都没留下…
展开
-
PostgresQL 数据库统计信息查看
Table 9-73. Database Object Size FunctionsNameReturn TypeDescriptionpg_column_size(any)intNumber of bytes used to store a particular value (possibly compressed)pg_dat原创 2016-05-12 14:27:41 · 4407 阅读 · 0 评论 -
C 中调用 PostgreSQL 内置动态加载函数的方法
调用 PostgreSQL 内置动态加载函数的方法普通函数使用位于 fmgr.h 中的各类 DirectFunctionCall 函数比如若想将一个时间间隔字符串转换为一个 PG 内置 interval 类型,PG 已经提供了一个 interval_in() 的动态加载函数,位于 timestamp.c,定义 snippet 如下:Datuminterval_in(PG_FUNCTION_ARGS原创 2016-11-15 16:09:46 · 1556 阅读 · 0 评论 -
PostgresQL FDW 源码分析之总结
1. FDW 先在 GetForeignRelSize() 中通过本地或向 remote 端查询的方式,得到了对 SQL 语句基本扫描方式的成本估算;2. 然后在 postgresGetForeignPaths() 计算出各种情况的 plan path,包括基础扫描方法,和各种 join 方法,path 中带有对这种 plan 处理方式的描述和成本估算;3. 在从多个 plan path 中选出一个 best path 后,在 postgresGetForeignPlan() 中,从这个 path 中恢原创 2016-07-02 22:35:37 · 2185 阅读 · 0 评论 -
PostgresQL FDW 源码分析之 postgresIterateForeignScan()
进入 postgresIterateForeignScan()在 fsstate 中保存有之前处理的信息,包括要发向 remote 端的 SQL 语句: PgFdwScanState *fsstate = (PgFdwScanState *) node->fdw_state; TupleTableSlot *slot = node->ss.ss_ScanTupleSlot;在原创 2016-07-02 22:34:39 · 815 阅读 · 0 评论 -
PostgresQL FDW 源码分析之 postgresBeginForeignScan()
在 postgresBeginForeignScan() 中主要进行 postgresIterateForeignScan() 中需要数据的准备工作。获取建立的外部表信息: /* Get info about foreign table. */ fsstate->rel = node->ss.ss_currentRelation; table = GetForeignTable(Rel原创 2016-07-02 11:12:56 · 741 阅读 · 0 评论 -
PostgresQL FDW 源码分析之 postgresGetForeignPlan()
进入 postgresGetForeignPlan()根据在 GetForeignRelSize() 中处理获得的 attrs_used 构造要发送到 remote 端的 SQL 语句,其中包括 targetList 和 local_conds 中提到的属性,然后加上属于 remote_conds 的 where 限制条件。 /* * Build the query strin原创 2016-07-02 22:33:29 · 736 阅读 · 0 评论 -
PostgresQL FDW 源码分析之 postgresGetForeignPaths()
进入 postgresGetForeignPaths()在 postgresGetForeignRelSize() 中已经对最基本的外部表扫描做了成本估算,所以就用这些信息,直接生成一个 plan path:/* * Create simplest ForeignScan path node and add it to baserel. This path * corresponds原创 2016-07-02 14:57:10 · 581 阅读 · 0 评论 -
PostgresQL FDW 源码分析之 GetForeignRelSize()
GetForeignRelSize() 的源码在 postgres_fdw.c 文件中。进入 GetForeignRelSize() 一开头,将 FDW 相关的 planner 信息存放在 PgFdwRelationInfo *fpinfo 中。PgFdwRelationInfo *fpinfo;fpinfo = (PgFdwRelationInfo *) palloc0(sizeof(PgFdwRelationInfo));baserel->fdw_private = (void *) fpin原创 2016-06-29 09:54:37 · 978 阅读 · 0 评论 -
开发 PostgreSQL 的 Cast 函数进行类型转换, 使用 CREATE CAST
先使用 CREATE FUNCTION function_name (argument_type [, ...]) 创建一个转换函数;然后 CREATE CAST (source_type AS target_type)WITH FUNCTION function_name (argument_type [, ...])当两种类型的底层表示相同时, 可以使用 WITHOUT FUNCTION;若想使用现成的 source_type 的 out 函数和 target_type 的 in 函数,原创 2016-04-29 11:43:21 · 13365 阅读 · 0 评论 -
PostgreSQL 聚合函数共享申请的内存空间
在编写聚合函数时,对每一行都会重复调用指定同一函数,如果要处理的数据是累加的,那么如果不在每次调用之间共享内存空间,而是不停的申请释放新的内存,那么速度会变得很慢,所以在这时共享内存是十分有用的:我们只要在 fn_mcxt 这个 MemoryContext 下申请内存,就可以让它保持在整个聚合的过程中,申请到的内存块指针,可以存放到 fn_extra 中,也可以作为返回值和入参传递在每次调用间,最后使用 FINALFUNC 制定的函数进行最终处理。原创 2016-05-06 16:10:37 · 1777 阅读 · 0 评论