发布于 2018
-
PgSQL 函数易变性等级分类
2018-04-06 @ 开发
PgSQL中的函数默认有三种易变性等级,合理使用可以显著改善性能。 核心种差 VOLATILE : 有副作用,不可被优化。 STABLE: 执行了数据库查询。 IMMUTABLE : 纯函数,执行结果可能会在规划时被预求值并缓存。 什么时候用? VOLATILE : 有任何写入,有任何副作用,需要看到外部命令所做的变更,或者调用了任何VOLATILE的函数 STABLE: 有数据库查询,但没有写入,或者函数的结果依赖于配置参数(例如时区) IMMUTABLE : 纯函数。 具体解释 每个 …
-
PgSQL Exclude约束
2018-04-06 @ 开发
Exclude约束是一个PostgreSQL扩展,它可以实现一些更高级,更巧妙的的数据库约束。 前言 数据完整性是极其重要的,但由应用保证的数据完整性并不总是那么靠谱:人会犯傻,程序会出错。如果能通过数据库约束来强制数据完整性那是再好不过了:后端程序员不用再担心竞态条件导致的微妙错误,数据分析师也可以对数据质量充满信心,不需要验证与清洗。 关系型数据库通常会提供PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK约束,然而并不是所有的业务约束都可以用这几种约束表达。一些 …
-
PgSQL Distinct On
2018-04-06 @ 开发
Distinct On是PostgreSQL提供的特有语法,可以高效解决一些典型查询问题,例如,快速找出分组内具有最大最小值的记录。 前言 找出分组内具有最大最小值的记录,这是一个非常常见的需求。用传统SQL当然有办法解决,但是都不够优雅,PostgreSQL的SQL扩展语法Distinct ON能一步到位解决这一类问题。 DISTINCT ON 语法 SELECTDISTINCTON(expression[,expression...])select_list...Here …
发布于 2017
-
GO与PG实现缓存同步
2017-08-03 @ 开发
Parallel与Hierarchy是架构设计的两大法宝,缓存是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性(和实时性)。 PostgreSQL在版本9引入了流式复制,在版本10引入了逻辑复制,但这些都是针对PostgreSQL数据库而言的。如果希望PostgreSQL中某张表的部分数据与应用内存中的状态保持一致,我们还 …
-
PgSQL审计触发器
2017-06-09 @ 开发
有时候,我们希望记录一些重要的元数据变更,以便事后审计之用。 PostgreSQL的触发器就可以很方便地自动解决这一需求。 -- 创建一个审计专用schema,并废除所有非superuser的权限。 DROPSCHEMAIFEXISTSauditCASCADE;CREATESCHEMAIFNOTEXISTSaudit;REVOKECREATEONSCHEMAauditFROMPUBLIC;-- …