Recent Posts

开放dblink , fdw带来的安全隐患

5 minute read

背景 PostgreSQL 有些插件是支持网络访问的,比如dblink, fdw等,可以访问外部服务。 如果开放这些插件,并且网络隔离没有做好的话,可能会带来一些安全隐患,比如通过这些插件,能够访问数据库主机内网的其他机器。 正文 如果你把超级用户开放给用户,危险更加严峻 dblink_connect和db...

PostgreSQL 流计算指 pipelinedb 实时处理Kafka消息流

3 minute read

背景 Kafka是一个分布式的消息系统,应用范围广泛,例如用于消息管理,WEB站点的活跃度跟踪,监控数据,日志聚合,流处理,提交日志,等等。 具体可参考: http://kafka.apache.org/documentation.html#gettingStarted 对于流数据记录的场景,我们可能会想到...

PostgreSQL Oracle 兼容性 - Oracle反转索引 迁移到PostgreSQL可用函数索引或哈希索引

1 minute read

背景 Oracle为了解决索引页热点的问题,推出了反转索引。 应用场景如下,当用户插入的数据是有序数据时,并且遇到高并发的插入请求,可能造成索引页的写竞争,从而增加了等待时间。 反转索引是指索引中存储的是反转值,人为的将有序的数据转换为无序的数据,从而减少索引页的写竞争。但是反转索引有个问题,如果要查询一个范...

float和numeric性能对比

2 minute read

背景 由于PostgreSQL自己实现了numeric这个数据类型,所以我们对比一下它和double的性能差别在哪里? 创建测试表: postgres=# create table tt(c1 numeric,c2 numeric); CREATE TABLE postgres=# create ta...

PostgreSQL 浮点精度调整(extra_float_digits)

1 minute read

背景 之前写过一篇文章介绍PostgreSQL浮点类型存储值和表述值不一致带来的问题。 请参考: 《don’t mistake the float/double’s display & real value》 浮点精度,在大多数平台中,float4精确到6位数字,float8精确到15位数字。 O...

[转]一篇超赞的 PostgreSQL query 生命周期分析

6 minute read

背景 一个查询从客户端发起请求到客户端收到请求,一般分为6个阶段: 客户端请求 Parser将原始的query string转换为parsed query tree,通过打开参数debug_print_parse 可以观察这部分信息。 Analyzer,根据重写规则重构query tree,(例如view),输出...

基于PostgreSQL的流式PipelineDB, 1000万/s实时统计不是梦

12 minute read

背景 PipelineDB是基于PostgreSQL研发的一种流式关系数据库(0.8.1基于9.4.4),这种数据库的特点是自动处理流式数据,不存储原始数据,只存储处理后的数据,所以非常适合当下流行的实时流式数据处理。 例如网站流量统计,IT服务的监控统计,APPStore的浏览统计,物联网的传感器数据实时统计...

为什么PostgreSQL UUID-OSSP可能产生重复值?

5 minute read

背景 PostgreSQL提供了一个插件来产生UUID值,但是,某些情况下是否有可能产生重复的值呢? 答案是有可能,从代码分析就知道原因了。 这里要分BSD平台和Linux平台来讲。 首先我们看看用来产生UUID的函数,其中3个是不带参数的。 postgres=# \df+ uuid_generate_v...

PostgreSQL 逻辑复制插件 UDR, 可以愉快的玩类似MySQL的binlog复制了

5 minute read

背景 PostgreSQL 的流复制素来以高效,实时,稳定著称; 为企业解决了很多问题,例如容灾,备份,HA,读写分离等等。 但是流复制有一个无法克服的弊端,下游节点只能做到只读,并且只能复制整个集群(使用walbouncer可以做到基于表空间或库级别的物理流复制)。 http://www.cybertec...

PostgreSQL数据库 OLTP高并发请求性能优化

2 minute read

背景 在多核系统中,一般TPS会随并发数的增加而提升,但是当并发数超过一定的数值(如CPU核数的2到3倍以后),性能开始下降,并发数越高,下降越严重。 例子: 更新500万记录表中的1条随机记录。开8000个并发。 create table test_8000 (id int primary key, cn...