自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

davidzwb的博客

研究 PostgreSQL

  • 博客(15)
  • 收藏
  • 关注

原创 Redis源码探究-事件驱动网络编程-Server

Redis源码探究-事件驱动网络编程-Server 本文使用的是 github 上 Redis 最早的源代码,Redis 1.3.6,发布于 2010 年。Redis 使用了事件驱动网络编程,其核心是:注册事件,提供回调,非阻塞 IO。EventLoop事件驱动的核心是 EventLoop 结构,它代表了一个 Event Loop,也就是说,使用者向这个 EventLoop 注册事件,并提供回

2017-04-23 00:34:02 546

原创 PostgreSQL 在 C 语言程序中查询系统表 System Catalog

PostgreSQL 在 C 语言程序中查询系统表 System Catalog查找某个系统对象的 OID: 由于本人也在学习阶段,目前仅能分享在 System Catalog 中查询对象 OID 的方法。需要关注的函数是 GetSysCacheOid1/GetSysCacheOid2/GetSysCacheOid3/GetSysCacheOid4 系列函数,通过它们来查询 System Ca

2017-02-14 09:40:13 630

原创 PostgreSQL 优化器的初步分析:query_planner()

PostgreSQL 优化器的初步分析:query_planner():query_planner() 是优化器生成 path 的基础,所以首先从这里开始分析起。query_planner() 负责生成一个基本的 path,这个 path 除了基本的扫描表的操作外,最后最多只包含连接操作,剩下的其他诸如聚合或者 limit 等操作,则会到更外层的 grouping_planner() 中进行。进入

2016-11-28 10:41:34 1677

原创 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 1552

原创 Postgres FDW 中由 PGresult 结构生成 HeapTuple 的过程

在 bool nulls[] 数组中存储每一列中是否为空,值为 true(0) 或 false(1),在 datum values[] 中则存放由 C 字符串转化为 tuple datum 格式的数据值,转化的方法由 attinmeta 提供。上述的 tupleDesc, retrieved_attrs 和 attinmeta 若有需要,都是可以通过调用一些函数自己构造的,文末将会提供构造方法。最后调用 heap_form_tuple(tupdesc, values, nulls) 由 tupdes

2016-10-18 17:34:21 940

原创 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 2177

原创 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 810

原创 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 731

原创 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 574

原创 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 728

原创 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 968

原创 Ubuntu 机箱前置音频接口不能用的解决方法

1. 编辑 alsa-base.conf 文件:sudo gedit /etc/modprobe.d/alsa-base.conf在文件最后新起一行,加入如下语句options snd-hda-intel model=auto 2. 使用 alsamixer 打开声音、调节音量:用方向键左右调节到左下角的 ,可以看到左上角写的 Off,这时按 m 键调节,使 Off

2016-05-27 14:59:59 2853 1

原创 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 4399

原创 PostgreSQL 聚合函数共享申请的内存空间

在编写聚合函数时,对每一行都会重复调用指定同一函数,如果要处理的数据是累加的,那么如果不在每次调用之间共享内存空间,而是不停的申请释放新的内存,那么速度会变得很慢,所以在这时共享内存是十分有用的:我们只要在 fn_mcxt 这个 MemoryContext 下申请内存,就可以让它保持在整个聚合的过程中,申请到的内存块指针,可以存放到 fn_extra 中,也可以作为返回值和入参传递在每次调用间,最后使用 FINALFUNC 制定的函数进行最终处理。

2016-05-06 16:10:37 1776

原创 开发 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 13348

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除