跳转到主要内容

标签: PG开发

  • Git for Data: 瞬间克隆PG数据库

    冯若航 发布于 PGSQL 3518 字 8 分钟

    冯若航PostgreSQLPG开发GIS

    Git for Data: 瞬间克隆PG数据库

    每个程序员都用过 git clone。敲下回车,几秒钟后,一个完整的代码仓库就躺在硬盘上了。 但数据库呢? 想给测试环境搞一份生产数据的副本?传统方案是 pg_dump + pg_restore。一个 100GB 的库,喝杯咖啡回来可能还没完。想做并行测试?再等一轮。想给 AI Agent 一个可以随便折腾的沙盒?那得准备好足够的磁盘和耐心。 最近一堆数据库公司都在卷 “Git for Data”,理由是:有了数据版本控制,Agent 就可以放心在数据库里乱搞,坏了随时回滚。 但这玩意 …

    每个程序员都用过 git clone。敲下回车,几秒钟后,一个完整的代码仓库就躺在硬盘上了。 但数据库呢? 想给测试环境搞一份生产数据的副本?传统方案是 pg_dump + pg_restore。一个 100GB 的库,喝杯咖啡回来可能还没完。想做并行测试?再等一轮。想给 AI Agent 一个可以随便折腾的沙盒?那得准备好足够的磁盘和耐心。 最近一堆数据库公司都在卷 “Git for Data”,理由是:有了数据版本控制,Agent 就可以放心在数据库里乱搞,坏了随时回滚。 但这玩意 …

  • 聚焦六大功能:PostgreSQL 18 新特性深度解析

    IvorySQL 发布于 PGSQL 10989 字 22 分钟

    IvorySQLPostgreSQLPG开发性能

    聚焦六大功能:PostgreSQL 18 新特性深度解析

    原作者:IvorySQL · 微信公众号转载页 PostgreSQL 全球开发组于 2025 年 5 月 8 日发布了 PostgreSQL 18 的首个 Beta 版本,正式版已于 9 月 25 日正式上线。本文 IvorySQL 社区将为大家拆解 PostgreSQL 18 的六大亮点特性。 一、PG 异步 I/O(AIO)框架:迈出打破同步阻塞瓶颈的第一步 PostgreSQL 18 全新引入异步 I/O 子系统。新机制允许特定场景下并行执行多个异步预读操作,CPU 无需等待数据返回即可 …

    原作者:IvorySQL · 微信公众号转载页 PostgreSQL 全球开发组于 2025 年 5 月 8 日发布了 PostgreSQL 18 的首个 Beta 版本,正式版已于 9 月 25 日正式上线。本文 IvorySQL 社区将为大家拆解 PostgreSQL 18 的六大亮点特性。 一、PG 异步 I/O(AIO)框架:迈出打破同步阻塞瓶颈的第一步 PostgreSQL 18 全新引入异步 I/O 子系统。新机制允许特定场景下并行执行多个异步预读操作,CPU 无需等待数据返回即可 …

  • PostgreSQL 规约(2024版)

    冯若航 发布于 PGSQL 13960 字 28 分钟

    冯若航PostgreSQLPG开发

    PostgreSQL 规约(2024版)

    0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发/运维规约,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑:你好我也好,大家都好。 本文第一版主要针对 PostgreSQL 9.4 - PostgreSQL 10 版本 ,当前最新版本针对 PostgreSQL 15/16/17 进行更新与调整。 0x01 命名规范 计算机科 …

    0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发/运维规约,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑:你好我也好,大家都好。 本文第一版主要针对 PostgreSQL 9.4 - PostgreSQL 10 版本 ,当前最新版本针对 PostgreSQL 15/16/17 进行更新与调整。 0x01 命名规范 计算机科 …

  • 灿灿荐书:《收获,不止 SQL 优化》

    熊灿灿 发布于 PGSQL 4788 字 10 分钟

    熊灿灿PostgreSQLOraclePG开发

    灿灿荐书:《收获,不止 SQL 优化》

    原作者:熊灿灿 · 微信公众号转载页 前言 昨日,终于见到了数据库圈的前辈梁大师,梁大师的名号用文字描述略显苍白,懂得都懂。茶余饭后,绕湖一圈,好不快哉。 (原谅我油光满面,属实是加班够呛) 虽然我与梁大师结识时间并不久,并且一直是"网友",但正如文章标题,一见如故,仿佛相识多年的老友一样,交谈甚欢,也没有感受到任何隔阂。梁大师是位和蔼幽默的人,每每交流到尽兴之时,便会开怀大笑。梁大师也赠予了我他编著的知名书籍——《收获,不止 SQL 优化》,亲笔签名😎 (请容笔者小小炫个富) 聊起 SQL …

    原作者:熊灿灿 · 微信公众号转载页 前言 昨日,终于见到了数据库圈的前辈梁大师,梁大师的名号用文字描述略显苍白,懂得都懂。茶余饭后,绕湖一圈,好不快哉。 (原谅我油光满面,属实是加班够呛) 虽然我与梁大师结识时间并不久,并且一直是"网友",但正如文章标题,一见如故,仿佛相识多年的老友一样,交谈甚欢,也没有感受到任何隔阂。梁大师是位和蔼幽默的人,每每交流到尽兴之时,便会开怀大笑。梁大师也赠予了我他编著的知名书籍——《收获,不止 SQL 优化》,亲笔签名😎 (请容笔者小小炫个富) 聊起 SQL …

  • AI大模型与向量库 PGVector

    冯若航 发布于 PGSQL 3640 字 8 分钟

    冯若航PostgreSQLPG开发扩展向量

    AI大模型与向量库 PGVector

    新 AI 应用在过去一年中出现了指数爆炸的增长态势,而这些应用面临的一个共同挑战是如何大规模地 存储 与 查询 以向量表示的 AI Embedding。本文聚焦被 AI 炒火了的 向量数据库,介绍了AI嵌入与向量存储检索的基本原理,并用一个具体的知识库检索案例来串联介绍向量数据库插件 PGVECTOR 的功能、性能、获取与应用。 AI是怎么工作的 GPT 展现出来了强大的智能水平,它的成功有很多因素,但在工程上关键的一步是:神经网络与大语言模型将一个语言问题转化为数学问题,并使用工程手段高效解决 …

    新 AI 应用在过去一年中出现了指数爆炸的增长态势,而这些应用面临的一个共同挑战是如何大规模地 存储 与 查询 以向量表示的 AI Embedding。本文聚焦被 AI 炒火了的 向量数据库,介绍了AI嵌入与向量存储检索的基本原理,并用一个具体的知识库检索案例来串联介绍向量数据库插件 PGVECTOR 的功能、性能、获取与应用。 AI是怎么工作的 GPT 展现出来了强大的智能水平,它的成功有很多因素,但在工程上关键的一步是:神经网络与大语言模型将一个语言问题转化为数学问题,并使用工程手段高效解决 …

  • 高级模糊查询的实现

    冯若航 发布于 PGSQL 4963 字 10 分钟

    冯若航PostgreSQLPG开发

    高级模糊查询的实现

    日常开发中,经常见到有模糊查询的需求。今天就简单聊一聊如何用PostgreSQL实现一些高级一点的模糊查询。 当然这里说的模糊查询,不是 LIKE 表达式前模糊后模糊两侧模糊,这种老掉牙的东西。让我们直接用一个具体的例子开始吧。 问题 现在,假设我们做了个应用商店,想给用户提供 搜索功能。用户随便输入点什么,找出所有与输入内容匹配的应用,排个序返回给用户。 严格来说,这种需求其实是需要一个搜索引擎,最好还是用专用软件,例如ElasticSearch来搞。但实际上只要不是特别复杂的逻辑,也可以很好 …

    日常开发中,经常见到有模糊查询的需求。今天就简单聊一聊如何用PostgreSQL实现一些高级一点的模糊查询。 当然这里说的模糊查询,不是 LIKE 表达式前模糊后模糊两侧模糊,这种老掉牙的东西。让我们直接用一个具体的例子开始吧。 问题 现在,假设我们做了个应用商店,想给用户提供 搜索功能。用户随便输入点什么,找出所有与输入内容匹配的应用,排个序返回给用户。 严格来说,这种需求其实是需要一个搜索引擎,最好还是用专用软件,例如ElasticSearch来搞。但实际上只要不是特别复杂的逻辑,也可以很好 …

  • PG复制标识详解(Replica Identity)

    冯若航 发布于 PGSQL 3874 字 8 分钟

    冯若航PostgreSQLPG管理PG开发

    PG复制标识详解(Replica Identity)

    引子:土法逻辑复制 复制身份的概念,服务于 逻辑复制。 逻辑复制的基本工作原理是,将逻辑发布相关表上 对行的增删改 事件解码,复制到逻辑订阅者上执行。 逻辑复制的工作方式有点类似于行级触发器,在事务执行后对变更的元组逐行触发。 假设您需要自己通过触发器实现逻辑复制,将一章表A上的变更复制到另一张表B中。通常情况下,这个触发器的函数逻辑通常会长这样: -- 通知触发器 CREATE OR REPLACE FUNCTION replicate_change() RETURNS TRIGGER AS …

    引子:土法逻辑复制 复制身份的概念,服务于 逻辑复制。 逻辑复制的基本工作原理是,将逻辑发布相关表上 对行的增删改 事件解码,复制到逻辑订阅者上执行。 逻辑复制的工作方式有点类似于行级触发器,在事务执行后对变更的元组逐行触发。 假设您需要自己通过触发器实现逻辑复制,将一章表A上的变更复制到另一张表B中。通常情况下,这个触发器的函数逻辑通常会长这样: -- 通知触发器 CREATE OR REPLACE FUNCTION replicate_change() RETURNS TRIGGER AS …

  • 事务隔离等级注意事项

    冯若航 发布于 PGSQL 3070 字 7 分钟

    冯若航PostgreSQLPG开发

    事务隔离等级注意事项

    PostgreSQL实际上只有两种事务隔离等级:读已提交(Read Commited) 与 可序列化(Serializable) 基础 SQL标准定义了四种隔离级别,但PostgreSQL实际上只有两种事务隔离等级:读已提交(Read Commited) 与 可序列化(Serializable) SQL标准定义了四种隔离级别,但实际上这也是很粗鄙的一种划分。详情请参考并发异常那些事。 查看/设置事务隔离等级 通过执行:SELECT …

    PostgreSQL实际上只有两种事务隔离等级:读已提交(Read Commited) 与 可序列化(Serializable) 基础 SQL标准定义了四种隔离级别,但PostgreSQL实际上只有两种事务隔离等级:读已提交(Read Commited) 与 可序列化(Serializable) SQL标准定义了四种隔离级别,但实际上这也是很粗鄙的一种划分。详情请参考并发异常那些事。 查看/设置事务隔离等级 通过执行:SELECT …

  • 前后端通信线缆协议

    冯若航 发布于 PGSQL 1168 字 3 分钟

    冯若航PostgreSQLPG开发PG内核

    前后端通信线缆协议

    了解PostgreSQL服务器与客户端通信使用的TCP协议 启动阶段 启动阶段的基本流程如下所示: 客户端发送一条 StartupMessage (F) 向服务端发起连接请求 载荷包括 0x30000 的Int32版本号魔数,以及一系列kv结构的运行时参数(NULL0分割,必须参数为 user), 客户端等待服务端响应,主要是等待服务端发送的 ReadyForQuery (Z) 事件,该事件代表服务端已经准备好接收请求。 上面是连接建立过程中最主要的两个事件,其他事件包括包括认证消息 …

    了解PostgreSQL服务器与客户端通信使用的TCP协议 启动阶段 启动阶段的基本流程如下所示: 客户端发送一条 StartupMessage (F) 向服务端发起连接请求 载荷包括 0x30000 的Int32版本号魔数,以及一系列kv结构的运行时参数(NULL0分割,必须参数为 user), 客户端等待服务端响应,主要是等待服务端发送的 ReadyForQuery (Z) 事件,该事件代表服务端已经准备好接收请求。 上面是连接建立过程中最主要的两个事件,其他事件包括包括认证消息 …

  • CDC 变更数据捕获机理

    冯若航 发布于 PGSQL 9309 字 19 分钟

    冯若航PostgreSQLPG开发

    CDC 变更数据捕获机理

    在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 前驱知识 CDC与ETL 数据库在本质上是一个 状态集合,任何对数据库的 变更(增删改)本质上都是对状态的修改。 在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 …

    在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 前驱知识 CDC与ETL 数据库在本质上是一个 状态集合,任何对数据库的 变更(增删改)本质上都是对状态的修改。 在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 …

  • PostgreSQL中的锁

    冯若航 发布于 PGSQL 6662 字 14 分钟

    冯若航PostgreSQLPG开发PG管理

    PostgreSQL中的锁

    PostgreSQL的并发控制以 快照隔离(SI) 为主,以 两阶段锁定(2PL) 机制为辅。PostgreSQL对DML(SELECT, UPDATE, INSERT, DELETE 等命令)使用SSI,对DDL(CREATE TABLE 等命令)使用2PL。 PostgreSQL有好几类锁,其中最主要的是 表级锁 与 行级锁,此外还有页级锁,咨询锁等,表级锁 通常是各种命令执行时自动获取的,或者通过事务中的 LOCK 语句显式获取;而行级锁则是由 SELECT FOR …

    PostgreSQL的并发控制以 快照隔离(SI) 为主,以 两阶段锁定(2PL) 机制为辅。PostgreSQL对DML(SELECT, UPDATE, INSERT, DELETE 等命令)使用SSI,对DDL(CREATE TABLE 等命令)使用2PL。 PostgreSQL有好几类锁,其中最主要的是 表级锁 与 行级锁,此外还有页级锁,咨询锁等,表级锁 通常是各种命令执行时自动获取的,或者通过事务中的 LOCK 语句显式获取;而行级锁则是由 SELECT FOR …

  • GIN搜索的O(n²)复杂度

    冯若航 发布于 PGSQL 709 字 2 分钟

    冯若航PostgreSQLPG开发

    GIN搜索的O(n²)复杂度

    GIN索引如果使用很长的关键词列表进行搜索,会导致性能显著下降。本文解释了为什么GIN索引关键词搜索的时间复杂度为O(n^2) Here is the detail of why that query have O(N^2) inside GIN implementation. Details Inspect the index example_keys_idx postgres=# select oid,* from pg_class where relname = …

    GIN索引如果使用很长的关键词列表进行搜索,会导致性能显著下降。本文解释了为什么GIN索引关键词搜索的时间复杂度为O(n^2) Here is the detail of why that query have O(N^2) inside GIN implementation. Details Inspect the index example_keys_idx postgres=# select oid,* from pg_class where relname = …

  • 理解时间:闰年闰秒,时间与时区

    冯若航 发布于 数据库 6444 字 13 分钟

    冯若航PG开发数据库

    理解时间:闰年闰秒,时间与时区

    微信公众号原文 前几天出现了四年一遇的闰年 2月29号,每到这一天,总会有一些土鳖软件出现大翻车。这种问题如果运气不好,可能要等上四年才会暴露出来。比如今天新鲜出炉的:禾赛科技激光雷达和新西兰加油站都因为闰年Bug无法使用。 今天确实是个很应景的日子,所以重发这篇六年前写的老文。聊一聊闰年,闰秒,时间与时区的原理,以及在数据库与编程语言中的注意事项。 0x01 秒与计时 时间的单位是秒,但秒的定义并不是一成不变的。它有一个天文学定义,也有一个物理学定义。 世界时(UT1) 在最开始,秒的定义来 …

    微信公众号原文 前几天出现了四年一遇的闰年 2月29号,每到这一天,总会有一些土鳖软件出现大翻车。这种问题如果运气不好,可能要等上四年才会暴露出来。比如今天新鲜出炉的:禾赛科技激光雷达和新西兰加油站都因为闰年Bug无法使用。 今天确实是个很应景的日子,所以重发这篇六年前写的老文。聊一聊闰年,闰秒,时间与时区的原理,以及在数据库与编程语言中的注意事项。 0x01 秒与计时 时间的单位是秒,但秒的定义并不是一成不变的。它有一个天文学定义,也有一个物理学定义。 世界时(UT1) 在最开始,秒的定义来 …

  • PostgreSQL的触发器使用注意事项

    冯若航 发布于 PGSQL 2040 字 5 分钟

    冯若航PostgreSQLPG开发

    PostgreSQL的触发器使用注意事项

    概览 触发器行为概述 触发器的分类 触发器的功能 触发器的种类 触发器的触发 触发器的创建 触发器的修改 触发器的查询 触发器的性能 触发器概述 触发器行为概述:英文,中文 触发器分类 触发时机:BEFORE, AFTER, INSTEAD 触发事件:INSERT, UPDATE, DELETE,TRUNCATE 触发范围:语句级,行级 内部创建:用于约束的触发器,用户定义的触发器 触发模式:origin|local(O), replica(R),disable(D) 触发器操作 触发器的操作通 …

    概览 触发器行为概述 触发器的分类 触发器的功能 触发器的种类 触发器的触发 触发器的创建 触发器的修改 触发器的查询 触发器的性能 触发器概述 触发器行为概述:英文,中文 触发器分类 触发时机:BEFORE, AFTER, INSTEAD 触发事件:INSERT, UPDATE, DELETE,TRUNCATE 触发范围:语句级,行级 内部创建:用于约束的触发器,用户定义的触发器 触发模式:origin|local(O), replica(R),disable(D) 触发器操作 触发器的操作通 …

  • GeoIP 地理逆查询优化

    冯若航 发布于 PGSQL 2902 字 6 分钟

    冯若航PostgreSQLPG开发扩展GIS

    GeoIP 地理逆查询优化

    IP归属地查询的高效实现 在应用开发中,一个‘很常见’的需求就是GeoIP转换。将请求的来源IP转换为相应的地理坐标,或者行政区划(国家-省-市-县-乡-镇)。这种功能有很多用途,譬如分析网站流量的地理来源,或者干一些坏事。使用PostgreSQL可以多快好省,优雅高效地实现这一需求。 0x01 思路方法 通常网上的IP地理数据库的形式都是:start_ip, stop_ip , longitude, latitude,再缀上一些国家代码,城市代码,邮编之类的属性字段。大概长这样: …

    IP归属地查询的高效实现 在应用开发中,一个‘很常见’的需求就是GeoIP转换。将请求的来源IP转换为相应的地理坐标,或者行政区划(国家-省-市-县-乡-镇)。这种功能有很多用途,譬如分析网站流量的地理来源,或者干一些坏事。使用PostgreSQL可以多快好省,优雅高效地实现这一需求。 0x01 思路方法 通常网上的IP地理数据库的形式都是:start_ip, stop_ip , longitude, latitude,再缀上一些国家代码,城市代码,邮编之类的属性字段。大概长这样: …

  • 理解字符编码原理

    冯若航 发布于 数据库 10394 字 21 分钟

    冯若航PG开发数据库

    理解字符编码原理

    程序员,是与 Code(代码/编码) 打交道的,而字符编码又是最为基础的编码。 如何 使用二进制数来表示字符,这个 字符编码 问题并没有看上去那么简单,实际上它的复杂程度远超一般人的想象:输入、比较排序与搜索、反转、换行与分词、大小写、区域设置,控制字符,组合字符与规范化,排序规则,处理不同语言中的特异需求,变长编码,字节序与BOM,Surrogate,历史兼容性,正则表达式兼容性,微妙与严重的安全问题等等等等。 如果不了解字符编码的基本原理,即使只是简单常规的字符串比较、排序、随机访问操作,都 …

    程序员,是与 Code(代码/编码) 打交道的,而字符编码又是最为基础的编码。 如何 使用二进制数来表示字符,这个 字符编码 问题并没有看上去那么简单,实际上它的复杂程度远超一般人的想象:输入、比较排序与搜索、反转、换行与分词、大小写、区域设置,控制字符,组合字符与规范化,排序规则,处理不同语言中的特异需求,变长编码,字节序与BOM,Surrogate,历史兼容性,正则表达式兼容性,微妙与严重的安全问题等等等等。 如果不了解字符编码的基本原理,即使只是简单常规的字符串比较、排序、随机访问操作,都 …

  • PostgreSQL开发规约(2018版)

    冯若航 发布于 PGSQL 7398 字 15 分钟

    冯若航PostgreSQLPG开发软件工程

    PostgreSQL开发规约(2018版)

    微信公众号原文 0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑。你好我也好,大家都好。 0x01 命名规范 无名,万物之始,有名,万物之母。 【强制】 通用命名规则 本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等。 对象名务必只使用 …

    微信公众号原文 0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑。你好我也好,大家都好。 0x01 命名规范 无名,万物之始,有名,万物之母。 【强制】 通用命名规则 本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等。 对象名务必只使用 …

  • PostGIS高效解决行政区划归属查询

    冯若航 发布于 PGSQL 4305 字 9 分钟

    冯若航PostgreSQLPG开发GIS

    PostGIS高效解决行政区划归属查询

    微信公众号原文 在应用开发中,很多时候我们需要解决这样一个问题:根据用户的经纬度坐标,定位用户的行政区划。 我们收集到的是诸如 28°00'00"N 100°00'00.000"E 这样的经纬度坐标,但实际感兴趣的是这个点所属的行政区划:(中华人民共和国,云南省,迪庆藏族自治州,香格里拉市)。这种将地理坐标映射到某条记录的操作就称为 地理编码(GeoEncode)。高效实现地理编码是一个很有趣的问题。 本文介绍了该问题的解决与优化方案:能在确保正确性的前提下,能用几兆的空间,110μs的执行时 …

    微信公众号原文 在应用开发中,很多时候我们需要解决这样一个问题:根据用户的经纬度坐标,定位用户的行政区划。 我们收集到的是诸如 28°00'00"N 100°00'00.000"E 这样的经纬度坐标,但实际感兴趣的是这个点所属的行政区划:(中华人民共和国,云南省,迪庆藏族自治州,香格里拉市)。这种将地理坐标映射到某条记录的操作就称为 地理编码(GeoEncode)。高效实现地理编码是一个很有趣的问题。 本文介绍了该问题的解决与优化方案:能在确保正确性的前提下,能用几兆的空间,110μs的执行时 …

  • KNN极致优化:从RDS到PostGIS

    冯若航 发布于 PGSQL 8223 字 17 分钟

    冯若航PostgreSQLPG开发机器学习GIS

    KNN极致优化:从RDS到PostGIS

    灵活应用数据库的功能,可以轻松实现 GIS 圈选场景下三万倍的性能提升。 Level 方法 性能/耗时(ms) 可维护性/可靠性 备注 1 暴力扫表 30,000 - 形式简单 2 经纬索引 35 复杂度/魔数问题 额外复杂度 3 联合索引 10 复杂度/魔数问题 额外复杂度 4 GIST 4 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 5 btree_gist 联合索引 1 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 场景 互联网中的很多业务都涉 …

    灵活应用数据库的功能,可以轻松实现 GIS 圈选场景下三万倍的性能提升。 Level 方法 性能/耗时(ms) 可维护性/可靠性 备注 1 暴力扫表 30,000 - 形式简单 2 经纬索引 35 复杂度/魔数问题 额外复杂度 3 联合索引 10 复杂度/魔数问题 额外复杂度 4 GIST 4 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 5 btree_gist 联合索引 1 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 场景 互联网中的很多业务都涉 …

  • 用 Exclude 实现互斥约束

    冯若航 发布于 PGSQL 1600 字 4 分钟

    冯若航PostgreSQLPG开发

    用 Exclude 实现互斥约束

    Exclude约束是一个PostgreSQL扩展,它可以实现一些更高级,更巧妙的的数据库约束。 前言 数据完整性是极其重要的,但由应用保证的数据完整性并不总是那么靠谱:人会犯傻,程序会出错。如果能通过数据库约束来强制数据完整性那是再好不过了:后端程序员不用再担心竞态条件导致的微妙错误,数据分析师也可以对数据质量充满信心,不需要验证与清洗。 关系型数据库通常会提供 PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK 约束,然而并不是所有的业务约束都可以用这几种约束表达。 …

    Exclude约束是一个PostgreSQL扩展,它可以实现一些更高级,更巧妙的的数据库约束。 前言 数据完整性是极其重要的,但由应用保证的数据完整性并不总是那么靠谱:人会犯傻,程序会出错。如果能通过数据库约束来强制数据完整性那是再好不过了:后端程序员不用再担心竞态条件导致的微妙错误,数据分析师也可以对数据质量充满信心,不需要验证与清洗。 关系型数据库通常会提供 PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK 约束,然而并不是所有的业务约束都可以用这几种约束表达。 …

  • 函数易变性等级分类

    冯若航 发布于 PGSQL 1080 字 3 分钟

    冯若航PostgreSQLPG开发

    函数易变性等级分类

    PgSQL中的函数默认有三种易变性等级,合理使用可以显著改善性能。 核心种差 VOLATILE : 有副作用,不可被优化。 STABLE: 执行了数据库查询。 IMMUTABLE: 纯函数,执行结果可能会在规划时被预求值并缓存。 什么时候用? VOLATILE : 有任何写入,有任何副作用,需要看到外部命令所做的变更,或者调用了任何 VOLATILE 的函数 STABLE: 有数据库查询,但没有写入,或者函数的结果依赖于配置参数(例如时区) IMMUTABLE: 纯函数。 具体解释 每个函数都带 …

    PgSQL中的函数默认有三种易变性等级,合理使用可以显著改善性能。 核心种差 VOLATILE : 有副作用,不可被优化。 STABLE: 执行了数据库查询。 IMMUTABLE: 纯函数,执行结果可能会在规划时被预求值并缓存。 什么时候用? VOLATILE : 有任何写入,有任何副作用,需要看到外部命令所做的变更,或者调用了任何 VOLATILE 的函数 STABLE: 有数据库查询,但没有写入,或者函数的结果依赖于配置参数(例如时区) IMMUTABLE: 纯函数。 具体解释 每个函数都带 …

  • Distinct On 去除重复数据

    冯若航 发布于 PGSQL 832 字 2 分钟

    冯若航PostgreSQLPG开发

    Distinct On 去除重复数据

    Distinct On是PostgreSQL提供的特有语法,可以高效解决一些典型查询问题,例如,快速找出分组内具有最大最小值的记录。 前言 找出分组内具有最大最小值的记录,这是一个非常常见的需求。用传统SQL当然有办法解决,但是都不够优雅,PostgreSQL的SQL扩展语法Distinct ON能一步到位解决这一类问题。 DISTINCT ON 语法 SELECT DISTINCT ON (expression [, expression ...]) select_list ... Here …

    Distinct On是PostgreSQL提供的特有语法,可以高效解决一些典型查询问题,例如,快速找出分组内具有最大最小值的记录。 前言 找出分组内具有最大最小值的记录,这是一个非常常见的需求。用传统SQL当然有办法解决,但是都不够优雅,PostgreSQL的SQL扩展语法Distinct ON能一步到位解决这一类问题。 DISTINCT ON 语法 SELECT DISTINCT ON (expression [, expression ...]) select_list ... Here …

  • GO与PG实现缓存同步

    冯若航 发布于 PGSQL 2314 字 5 分钟

    冯若航PostgreSQLPG开发

    GO与PG实现缓存同步

    Parallel与Hierarchy是架构设计的两大法宝,缓存 是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性(和实时性)。 PostgreSQL在版本9引入了流式复制,在版本10引入了逻辑复制,但这些都是针对PostgreSQL数据库而言的。如果希望PostgreSQL中某张表的部分数据与应用内存中的状态保持一致,我们还是需要 …

    Parallel与Hierarchy是架构设计的两大法宝,缓存 是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性(和实时性)。 PostgreSQL在版本9引入了流式复制,在版本10引入了逻辑复制,但这些都是针对PostgreSQL数据库而言的。如果希望PostgreSQL中某张表的部分数据与应用内存中的状态保持一致,我们还是需要 …

  • 用触发器审计数据变化

    冯若航 发布于 PGSQL 658 字 2 分钟

    冯若航PostgreSQLPG开发

    用触发器审计数据变化

    有时候,我们希望记录一些重要的元数据变更,以便事后审计之用。 PostgreSQL的触发器就可以很方便地自动解决这一需求。 -- 创建一个审计专用schema,并废除所有非superuser的权限。 DROP SCHEMA IF EXISTS audit CASCADE; CREATE SCHEMA IF NOT EXISTS audit; REVOKE CREATE ON SCHEMA audit FROM PUBLIC; -- 审计表 CREATE TABLE …

    有时候,我们希望记录一些重要的元数据变更,以便事后审计之用。 PostgreSQL的触发器就可以很方便地自动解决这一需求。 -- 创建一个审计专用schema,并废除所有非superuser的权限。 DROP SCHEMA IF EXISTS audit CASCADE; CREATE SCHEMA IF NOT EXISTS audit; REVOKE CREATE ON SCHEMA audit FROM PUBLIC; -- 审计表 CREATE TABLE …

  • SQL实现ItemCF推荐系统

    冯若航 发布于 PGSQL 3369 字 7 分钟

    冯若航PostgreSQLPG开发机器学习

    SQL实现ItemCF推荐系统

    推荐系统大家都熟悉,猜你喜欢,淘宝个性化什么的,前年双十一搞了个大新闻,还拿了CEO特别贡献奖。 今天就来说说怎么用PostgreSQL 5分钟实现一个最简单ItemCF推荐系统,以推荐系统最喜闻乐见的movielens数据集为例。 原理 ItemCF的原理可以看项亮的《推荐系统实战》,不过还是稍微提一下吧,了解的直接跳过就好。 Item CF,全称Item Collaboration Filter,即基于物品的协同过滤,是目前业界应用最多的推荐算法。ItemCF不需要物品与用户的标签、属性,只 …

    推荐系统大家都熟悉,猜你喜欢,淘宝个性化什么的,前年双十一搞了个大新闻,还拿了CEO特别贡献奖。 今天就来说说怎么用PostgreSQL 5分钟实现一个最简单ItemCF推荐系统,以推荐系统最喜闻乐见的movielens数据集为例。 原理 ItemCF的原理可以看项亮的《推荐系统实战》,不过还是稍微提一下吧,了解的直接跳过就好。 Item CF,全称Item Collaboration Filter,即基于物品的协同过滤,是目前业界应用最多的推荐算法。ItemCF不需要物品与用户的标签、属性,只 …

  • UUID性质原理与应用

    冯若航 发布于 PGSQL 3254 字 7 分钟

    冯若航PostgreSQLPG开发架构

    UUID性质原理与应用

    最近一个项目需要生成业务流水号,需求如下: ID必须是分布式生成的,不能依赖中心节点分配并保证全局唯一。 ID必须包含时间戳并尽量依时序递增。(方便阅读,提高索引效率) ID尽量散列。(分片,与HBase日志存储需要) 在造轮子之前,首先要看一下有没有现成的解决方案。 Serial 传统实践上业务流水号经常通过数据库自增序列或者发码服务来实现。 MySQL 的 Auto Increment,Postgres 的 Serial,或者 Redis+lua 写个小发码服务都是方便快捷的解决方案。这种方 …

    最近一个项目需要生成业务流水号,需求如下: ID必须是分布式生成的,不能依赖中心节点分配并保证全局唯一。 ID必须包含时间戳并尽量依时序递增。(方便阅读,提高索引效率) ID尽量散列。(分片,与HBase日志存储需要) 在造轮子之前,首先要看一下有没有现成的解决方案。 Serial 传统实践上业务流水号经常通过数据库自增序列或者发码服务来实现。 MySQL 的 Auto Increment,Postgres 的 Serial,或者 Redis+lua 写个小发码服务都是方便快捷的解决方案。这种方 …