Hot topics

PostgreSQL 运维实战系列,第五期:容量规划与分区策略设计

PostgreSQL 运维实战系列,第五期:容量规划与分区策略设计 0. 前言:数据库不是无限增长的容器 前四期我们完成了生产环境搭建、高可用部署、性能调优和故障诊断。但还有两个问题经常被忽视直到最后一刻才暴露:数据库还能撑多久?数据量大了怎么办? 一个表从 1GB 增长到 1TB,查询延迟从 10ms 飙升至 10 秒,索引膨胀、VACUUM 跑不动、备份时间从小时变成天——这不是数据库的问题,这是“没有在正确的时间做正确的容量准备”的问题。 本期聚焦两个紧密关联的主题: 容量规划:回答“数据库还能用多久”“什么时候需要扩容”“预算该怎么要” 分区策略:回答“表太大了怎么拆”“数据生命周期怎么管”“维护如何自动化” 1. 容量规划:从“拍脑袋”到“预测模型” 1.1 为什么大多数 DBA 的容量规划是错的 90% 的 DBA 曾因经验不足或认知偏差踩过容量规划的“坑”——最常见的误区是“只看今天的数据量,忽略明天的增长模式”,导致扩容永远在追着故障跑。 数据库容量规划的本质是“资源天气预报”,就像天气预报需要分析气温、湿度、风向等多维数据,容量规划需要同时考虑存储、CPU、内存、I/O 的耦合关系。 数据增长不是匀速的: 线性增长:用户注册量——每天多 1000 人,稳定可预测 周期性增长:电商订单——工作日低、周末高、双十一脉冲 季节性增长:企业财务系统——月底、季末、年底各有高峰 指数增长:短视频用户行为日志——一旦业务爆发,就是噩梦 核心原则:容量规划不能靠“感觉”,必须靠“数据”。 1.2 容量规划公式:存储、CPU、内存、I/O 四维模型 存储容量:数据本体 + 索引堆栈 + WAL 日志 + 临时文件 数据的四个空间来源分别为: 表数据本体:基准可直接由 pg_total_relation_size('table_name') 捕获 索引开销:每个 B-tree 索引通常占主表数据量的 50%~100%。一个 500GB 的表拥有一组复合或二级索引,再加上几个大字段,总占用可能翻倍 WAL 日志与临时文件:归档或流复制场景中需额外预算空间,单次大查询的临时文件可能达到 GB 级 死元组膨胀:不及时 VACUUM 的表,死元组占比可能超过 20% 长期预测实施建议: 每日采集 pg_total_relation_size 和 n_tup_ins - n_tup_del 写入历史表 基于过去 30 天数据做线性回归预测未来 90 天的增长趋势 设置阈值:预测剩余空间少于 60 天用量时触发预警通知 2. 分区策略:设计比执行更重要 2.1 什么时候该分区?——误判比拖延更可怕 分区不是银弹。不少开发者对分区抱有“巨大表一分区就变快”的幻想——但实际上,分区的首要目标是改善维护体验(加速数据清理、简化 VACUUM、控制索引大小)。查询速度在不使用分区键时不降级已是成功。 什么时候该分区: 表超过 3000 万行或 50GB,维护操作(VACUUM、索引重建)耗时过长 需要按时间批量删除旧数据(每月/每季度删除过期数据)——分区能秒级 DETACH,而 DELETE 则需要数小时 查询模式天然带时间范围(WHERE created_at BETWEEN ...)或地域分组 索引本身已大到无法全部放入内存 什么时候不该分区: 总数据量在 100GB 以内且增长平稳——无端增加复杂度 小表(<10GB)分库分表是徒劳,额外的约束检查反而可能降低查询性能 应用程序无法或不方便在查询条件中带上分区键 2.2 类型对比与选型表 分区类型 语法 典型场景 优势 限制 RANGE PARTITION BY RANGE (created_at) 时间序列表、日志、事件流 最自然的滚动淘汰方式,分区裁剪效果最好 分区键必须用于 WHERE,跨分区点查性能可能比哈希分区略差 LIST PARTITION BY LIST (region) 按地区、状态、类型分组的数据 离散值管控很简单 只支持单列分区键,不适用范围分区 HASH PARTITION BY HASH (user_id) 海量用户数据平摊,负载极度均匀 消除数据热点,均匀分布 不适用范围查询;扩容时整个集群需要人工干预重分布数据,适合预规划一次性建好足够数量的分区(如 64 或 128) 2.3 声明式分区语法速查 按日/月/季度范围分区是最常用的架构,通常搭配 created_at(时间戳)索引: -- 创建父表 CREATE TABLE events ( id BIGSERIAL, user_id BIGINT NOT NULL, event_type TEXT NOT NULL, payload JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ) PARTITION BY RANGE (created_at); -- 按月添加分区(建议自动化脚本执行) CREATE TABLE events_2025_01 PARTITION OF events FOR VALUES FROM ('2025-01-01') TO ('2025-02-01'); CREATE TABLE events_2025_02 PARTITION OF events FOR VALUES FROM ('2025-02-01') […]

PostgreSQL 运维实战系列,第四期:故障排查与深度诊断实战

PostgreSQL 运维实战系列,第四期:故障排查与深度诊断实战 0. 前言:问题总会来,诊断能力决定你能走多远 前三期我们覆盖了生产环境搭建、高可用架构和性能调优。但无论你的系统建得多稳固,问题总会来——慢查询、连接风暴、磁盘写满、备库延迟、死锁……区别在于:优秀的 DBA 在故障还在“症状期”就发现了它;平庸的 DBA 在“故障期”才开始排查;而糟糕的 DBA 在“灾难期”才被叫醒。 数据库专业人员在工作中常遇到诸如响应速度缓慢、死锁增多、复制Slot异常、大表膨胀甚至数据库崩溃等问题。诊断是 DBA 最核心的技能,它不来自于天赋,而来自系统的方法论和反复的演练。 本期聚焦 如何系统性地诊断 PostgreSQL 生产故障,涵盖:慢查询全链路诊断、锁阻塞与死锁分析、表膨胀判定与 VACUUM 急救、WAL 堆积根因定位、日志统一分析与巡检工具链——形成一套从“发现”到“定位”再到“修复”的完整方法论。 1. 慢查询诊断:从“慢”到“哪里慢” 1.1 发现慢查询:生产环境需要三层监控 第一层——日志自动捕捉:通过 auto_explain 模块自动记录所有慢查询的执行计划,无需人工干预。配置如下: # postgresql.conf shared_preload_libraries = 'auto_explain' auto_explain.log_min_duration = 1000 # 记录超过 1 秒的查询 auto_explain.log_analyze = on # 输出真实执行时间(有性能开销) auto_explain.log_buffers = on # 查看读了多少数据块 auto_explain.log_timing = on auto_explain.log_nested_statements = on auto_explain 尤其适用于大型应用中跟踪那些难以手动发现的非优化查询。将 log_min_duration 设为 0 会记录所有查询计划,有性能开销,生产环境建议设为 1000–5000ms。 第二层——实时统计聚合:pg_stat_statements 无需等慢查询发生,随时可查询过去一段时间的高负载模式: -- 找到总耗时最高的查询(全局性能热点) SELECT queryid, query, calls, total_exec_time, mean_exec_time, rows, shared_blks_hit, shared_blks_read FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; 第三层——业务链路关联:在应用日志中记录请求 ID 并回填数据库日志,实现“一个慢页面 → 一个慢 SQL → 一个执行计划”的完整溯源链路。 1.2 EXPLAIN 进阶:BUFFERS 才是真相 标准 EXPLAIN ANALYZE 告诉你“有多慢”,但 EXPLAIN (ANALYZE, BUFFERS) 才能告诉你“慢在哪儿”。BUFFERS 揭示了每个执行节点读取了多少数据块,这是判断 I/O 瓶颈的关键线索。 EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM orders WHERE status = 'pending'; 输出解读: Seq Scan on orders (actual time=523.791..523.791 rows=0 loops=1) Buffers: shared read=24816 shared read=24816 意味着扫描触发了 24816 次磁盘 I/O——这是优化的主攻方向。通常读取的块数远多于实际返回的行数,说明索引条件未能有效缩小范围。 优化器估测偏差排查:EXPLAIN (ANALYZE, BUFFERS) 输出中的 actual rows 与计划估算的 rows 字段对比。如果偏差超过 10 倍(如估算返回 5 行,实际返回 5000 行),说明统计信息过时或因列间关联导致选择率计算错误,应及时执行 ANALYZE 或创建扩展统计。 1.3 auto_explain 实战:捕获“灵异慢查询” 某些间歇性慢查询难以手动复现——凌晨的批处理变慢。解决方案:启用 auto_explain.log_min_duration 生产级阈值设置,让数据库在查询运行时自动记录当时的执行计划。生产环境中建议配置 log_analyze,但需注意 auto_explain.log_timing 会因频繁读取系统时钟显著增加开销,可按需关闭。 现场回放的终极手段:将清理后的查询语句与优化后的执行计划固化后,利用 pg_hint_plan 恢复对数据库的控制权。 /*+ SeqScan(orders) */ SELECT * FROM orders WHERE status = 'pending' AND created_at > now() - interval '7 days'; 2. 锁阻塞与死锁:生产环境的最大隐形杀手 锁问题在单节点开发时几乎看不出来,一到生产高并发环境就暴露。处理此类标准的流程遵循“排查定位 → 处理解锁 → 预防优化”的闭环。 2.1 阻塞源定位三步法 第一步——找出在等锁的进程: SELECT pid, usename, application_name, state, […]

PostgreSQL 运维实战系列,第三期:性能调优与查询优化深度实践

PostgreSQL 运维实战系列,第三期:性能调优与查询优化深度实践 0. 前言:为什么 80% 的性能问题集中在查询层 前两期我们搭建了生产环境和高可用架构,但有了一个稳定运行的集群只是起点。数据库的最终价值在于以最低的延迟和成本返回数据——而决定这一点的核心是查询优化。 大多数“慢数据库”本质上不是硬件不够、配置不对,而是查询写得不好,索引建得不到位。Andrew Atkinson 在《High Performance PostgreSQL》中指出,很多性能问题都源于不够完善的数据库设计实践和索引策略。解决 80% 的性能问题,只需要掌握三件事:读懂执行计划、建对索引、避开反模式。这就是第三期的全部内容。 1. 读懂 EXPLAIN:DBA 的必修课 1.1 从执行计划看优化器的“思考” PostgreSQL 执行一条 SQL,要经历词法分析、语法分析、查询重写、查询规划器和执行器五个阶段,其中最关键的环节是查询规划器——它基于代价模型从多个候选方案中选择“成本最低”的,这个成本是一个结合 CPU 运算和磁盘 I/O 的综合估值。 而评估的基础是 ANALYZE 命令(或者在 autovacuum 触发下自动完成)收集的统计信息,存储在 pg_statistic 系统表中,包括:唯一值数量(n_distinct)、高频值及其频率(MCVs)、直方图分布等,最终可以通过 pg_stats 视图查看列级别的细节。 EXPLAIN ANALYZE 就是让我们一窥优化器“思考过程”的重要工具。 它的输出由两部分构成: 规划期的代价估算:优化器给出的估算行数、启动成本和总成本(cost=0.28..8.29,前一个数是启动成本,后一个是总成本); 执行期的实际数据:实际耗时(actual time 的单位是毫秒)、真实行数、循环次数,这才是验证优化器是否“猜对”的唯一依据。 当实际行数与估算行数差距巨大(比如实际返回 5000 行,估算只有 5 行)时,优化器很可能选择了次优计划。 1.2 读懂执行计划中的“危险信号” 用 EXPLAIN ANALYZE 诊断慢查询时,扫一眼输出就能精准定位问题的根源: 现象 执行计划中的表现 代价估算 最常见原因 解决动作 全表扫描 Seq Scan 出现在大户头上,同时 idx_scan 统计为 0 — WHERE 条件没有匹配的索引,或优化器低估了小表 对 WHERE/JOIN 列建索引;检查数据量,小表全表扫描亦可能是最优解 不必要的大规模排序 显式 Sort 节点,且 actual rows 非常大(比如百万级) — 缺少支持 ORDER BY 的索引;无索引排序将所有行装进内存 针对排序键单独加索引,或者用 btree(column) 索引代替 ORDER BY 严重行过滤 Rows Removed by Filter: X 里 X 远大于最终返回的行数 — 索引选择性差,大量数据被读入后才被过滤掉 建组合索引把过滤条件收紧;调整 WHERE 中条件的顺序 嵌套循环连接 Nested Loop 配 Join Filter,内表每行驱动一次 — 外表大 + 内表无索引,Nested Loop 演变成慢速查询 在内表的连接列上创建索引;或将 enable_nestloop 调至 off,让优化器转向 Hash Join 或 Merge Join Buffers: read 过多 Buffers: shared read=xxx — 内存容量不足,数据页反复从磁盘读取 提升 shared_buffers(专用服务器建议 25% 系统内存) 估算与实际严重偏离 actual rows 与 rows 估算值相差 10 倍以上 导致嵌套循环选错 统计信息陈旧,或数据分布不均列间强关联 执行 ANALYZE table;多列关联统计不足时用 CREATE STATISTICS 增加扩展统计 1.3 统计信息调优 默认统计采样大小由 default_statistics_target 控制,默认值为 100——在小表上用没问题,上了千万级别误差就很大了。实操方法: 全局提采样精度:将 default_statistics_target 从 100 提升至 200 或 500,增加 ANALYZE 的样本量,通常能带来明显改善。 个别列精准打击:业务中经常作为过滤条件的热列,不要走全局开关,用 ALTER TABLE table_name ALTER COLUMN column_name SET STATISTICS 5000 专门调高。 扩展统计捕捉列间相关性:对于 city 与 state 这种强关联列,仅凭单列统计信息会让优化器低估选择率,可执行 CREATE STATISTICS stats_city_state ON city, state FROM zipcodes; 后再 ANALYZE zipcodes;,让优化器感知列间依赖关系。 1.4 使用 hint 干预计划:什么时候该用,怎么用 […]

PostgreSQL 运维实战系列,第二期:高可用架构与流复制深度实践

PostgreSQL 运维实战系列,第二期:高可用架构与流复制深度实践 0. 前言:为什么要有高可用 上期我们搭建了一个单机生产环境。对大多数业务系统来说,单机是不够的——主库宕机时,系统就停摆了,这是不可接受的。数据库市场的消费趋势显示,高可用的部署变得越来越普遍,因为哪怕是几分钟的数据库中断,都可能意味着巨大的业务损失和用户信任危机。不过,比”如何搭建”更值得思考的是——我们需要多高的可用性? RTO(恢复时间目标)和 RPO(恢复点目标)是两个核心指标,它们共同定义了你的高可用目标。RTO 指从故障发生到恢复的时间窗口,RPO 指愿意接受的最大数据丢失量。不同的业务场景对应不同的组合: 业务场景 RTO RPO 推荐架构 核心交易系统(支付) < 30s 0 同步复制 + Patroni + 三机房 用户登录/订单查询 < 5min < 10s 同步流复制 + Patroni 后台报表/内部系统 < 30min < 30min 异步流复制 + 手动切换 本期聚焦:异步/同步流复制、Patroni 自动化高可用集群、复制槽管理、故障切换演练——覆盖从基础到生产级的完整高可用方案。 1. 流复制基础:高可用的基石 1.1 流复制原理速览 PostgreSQL 通过 WAL 日志复制实现主从同步。主库持续生成 WAL 段文件,从库通过网络不断流式拉取并重放,保持数据近乎实时同步。基于 WAL 的流式传输是物理复制,对应用完全透明,主从之间延迟极低,是目前生产环境最成熟稳定的方案。 1.2 两种复制模式的选择 异步模式下,主库写入成功即返回,WAL 发送到从库后由后者异步重放。这是大多数常规场景的选择,主库性能不受从库网络延迟影响。但故障发生时,尚未传输到从库的事务会丢失。Patroni 通过 maximum_lag_on_failover 参数控制可接受的数据丢失上限,稳态复制延迟通常在毫秒级。check_timeline 参数则确保不丢失数据的节点更可能被选为新主。 同步模式下,主库必须等待至少一个从库确认写入后才能返回成功。这会牺牲写吞吐量换取零数据丢失(RPO = 0),适合金融支付等核心场景。使用同步复制时,建议至少配置三个数据节点,否则单个同步从库宕机会导致主库阻塞写入;即便这样,同时失去主库和那个同步从库时,数据丢失的风险依然存在。 1.3 基础配置:从零搭建主从 在主库 postgresql.conf 中配置如下: wal_level = replica # 支持复制 max_wal_senders = 10 # WAL 发送进程数 max_replication_slots = 10 # 复制槽数量 synchronous_commit = off # 异步模式先关,同步模式改 on synchronous_standby_names = '*' # 同步模式必配,* 表示所有备库 wal_log_hints = on # 启用后 pg_rewind 正常工作,有少量开销但必要 在 pg_hba.conf 中为从库添加复制权限,然后重启主库从库即可建立连接。 2. 复制槽:高可用的隐形地雷 复制槽是我们为了保障高可用而引入的一个机制,但如果没有正确的管理,它反而可能成为系统的阿喀琉斯之踵。 2.1 它是什么,为什么危险? 复制槽(replication slot)是一个保证 WAL 不会被过早清除的持久化机制。每一个备库或 CDC 消费者都有一个对应的复制槽,数据库会保留所有未被该槽确认的 WAL 段。 最恐怖的影响:如果从库长期离线或逻辑同步服务被停用,对应的复制槽就会持续积压——它告诉数据库:”我还没消费完,你把 WAL 给我留着”。数据库会不折不扣地照做,如同一个忠心的管家,但代价是 pg_wal 目录将不断膨胀,直至磁盘写满,主库瞬间只读,集群陷入瘫痪。 2.2 双 WAL 清理的配置策略 物理复制槽:备库持续连接会自动推进消费位置。 逻辑复制槽:CDC 管道比物理备库更脆弱,逻辑同步服务断开一次就可能产生停滞槽。 关键兜底配置 —— max_slot_wal_keep_size: max_slot_wal_keep_size = 10GB # 单个槽最多占用 10GB,超过则直接丢弃槽,优先保磁盘 PG 18 新增——idle_replication_slot_timeout:闲置复制槽超过设定时间自动失效,进一步防御 WAL 膨胀。 2.3 日常监控脚本(必须每天执行) -- 检查槽位积压 SELECT slot_name, slot_type, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes, round(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) / 1024 / 1024, 2) AS lag_mb FROM pg_replication_slots; -- 找出最可能作恶的槽(PG 18 可直接用 idle … timeout 静默清理) SELECT slot_name, active, xmin FROM pg_replication_slots WHERE active = 'false' AND xmin IS NOT NULL; 3. Patroni:生产高可用的最终拼图 流复制解决了数据冗余问题,但故障切换需要自动化。Patroni 是目前 PostgreSQL 高可用的事实标准。它是一个用 Python 编写的高可用模板——之所以叫”模板”,因为它并非固定方案,而是提供可组合的组件,能适应不同基础设施。Patroni 支持 […]

PostgreSQL 运维实战系列,第一期:从零开始构建生产级数据库环境

PostgreSQL 运维实战系列,第一期:从零开始构建生产级数据库环境 0. 前言:为什么你需要一套规范的运维体系 PostgreSQL 已经成为全球最流行的开源关系数据库,被 Apple、Instagram、Spotify 等一线公司用于承载核心业务数据,并超越 MySQL 连续第三年居开发者调查榜首。但“把 PG 跑起来”和“把 PG 跑好”是两件完全不同的事。默认的 PostgreSQL 安装配置是极为保守的——它的设计目标是在最低硬件上稳定运行、不宕机。对于生产负载来说,这些默认配置浪费了巨大的性能空间。一个经过合理调优的 PG 实例,在同等硬件上可以承载 10 到 50 倍的吞吐量。 本系列定位:面向实际生产环境,从 DBA 的视角出发,覆盖安装部署、参数调优、日志管理、监控体系、备份恢复、容量规划、分区维护、VACUUM/ANALYZE 策略等核心运维主题。每一期都提供可直接落地的配置示例、检查清单和操作命令——不讲空泛的理论,只讲生产中真正需要的东西。 第一期从零开始,搭建一个生产级 PostgreSQL 环境,涵盖: 部署选型和安装 核心参数调优(附完整配置模版) 日志策略设计 监控体系搭建(Prometheus + Grafana) 备份恢复策略(含 PITR 配置) VACUUM/ANALYZE 精要 1. 部署:选好起点,少走一半弯路 1.1 版本选择策略 生产环境中,版本选择需平衡新特性与稳定性。截至 2026 年 4 月,当前发行版为 18,但以下原则长期有效: 首选:当前最新两个大版本(如 18、17)中相对成熟的那个。通常 .2 以上版本已足够稳定。 次选:上一个仍处于稳定支持期的版本,兼顾稳定性与足够长的剩余支持窗口。 慎重:追求“绝对稳定”而选择过于陈旧的版本(如仍使用 10/11/12),可能因错过关键性能优化和安全补丁而得不偿失——除非有外部合规或应用兼容约束。 1.2 包管理器 vs 源码编译 方式 适用场景 优缺点 官方仓库(推荐) 绝大多数生产环境 安装便利、安全更新及时、依赖管理完善 操作系统默认仓库 快速搭建测试环境 版本通常老旧,不推荐生产使用 源码编译 需要定制编译参数、debug 或研究内核的场景 灵活但运维复杂度高,需自行追踪安全更新 以 Ubuntu 22.04 LTS 为例,推荐使用 PG 官方仓库: # 添加官方仓库 sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update # 安装指定版本服务器及常用扩展 sudo apt install -y postgresql-17 postgresql-contrib-17 安装后的关键路径(以 PG 17 为例): /etc/postgresql/17/main/postgresql.conf # 主配置文件 /etc/postgresql/17/main/pg_hba.conf # 客户端认证配置 /var/lib/postgresql/17/main/ # PGDATA 数据目录 /var/log/postgresql/ # 默认日志目录 1.3 初始安全配置(上线前必须做的三件事) 第一,限制监听地址,避免数据库暴露在公网: sed -i "s/#listen_addresses = 'localhost'/listen_addresses = 'localhost,内网IP'/" /etc/postgresql/17/main/postgresql.conf 第二,编辑 pg_hba.conf,明确允许的应用服务器范围,拒绝一切不必要的来源: # 仅允许特定子网连接 host all all 10.0.0.0/8 md5 # 方法推荐使用 scram-sha-256 替代 md5,在 postgresql.conf 中设置 password_encryption = 'scram-sha-256' 第三,修改默认 postgres 超级用户密码,并创建日常运维专用角色,避免在日常操作中使用超级用户。 1.4 操作系统层面的准备工作 文件系统:XFS 或 EXT4 均可胜任。XFS 在大文件处理和并发写入场景下表现略优,但两者没有本质差异。关键在于:数据目录建议挂载独立磁盘分区,避免与操作系统争抢 I/O。 内核参数:适当增加 shmmax 和 shmall 以满足 PG 的共享内存需求;关闭透明大页(THP)以避免内存分配的意外延迟。 专用用户:PostgreSQL 应运行在 postgres 专用系统用户下,并严格限制该用户的 shell 访问权限。 2. 参数调优:从“能跑”到“跑得稳” 默认的 postgresql.conf 是“求稳”的最小配置——它能在树莓派上运行,但不适合任何真实的生产负载。本节提供一套经过生产验证的配置模版,直接可用。 2.1 核心内存参数 以一台 32GB 内存、16 核 CPU、SSD 存储的专用数据库服务器为例: # […]

PostgreSQL 扩展生态全景解析(第六期):AI 原生数据库 —— 扩展生态的终局与未来

PostgreSQL 扩展生态全景解析(第六期):AI 原生数据库 —— 扩展生态的终局与未来 引言:从五期旅程到 AI 原生之问 五期,五扇“门”,逐一打开。 第一期,我们站在入口,看见了 PostgreSQL 扩展生态的全貌——超过 1000 个扩展,从数据联邦到安全审计,从过程语言到性能监控。第二期,PostGIS 敞开了空间之门——数据库从此“看懂”地图:点、线、多边形,距离、包含、相交,一切地理概念都落在 SQL 里。第三期,pgvector 敞开了语义之门——高维向量变成原生数据类型,数据库从“匹配关键词”走向“理解含义”。第四期,TimescaleDB 敞开了时间之门——万亿级时序数据、自动分区、在线压缩、连续聚合,数据库从“被动存储时间”走向“主动驾驭时间之河”。第五期,我们推开分布式之门——Citus、FDW、存算分离、Kubernetes 原生——单机的天花板被打破,数据库的边界从一台机器扩展到一个集群、一片云、一个全球分布的系统。 五扇门之后,一个更根本的问题浮现出来:终点在哪里? 是 CAP 理论无法打破的分布式困境?是无止境的性能爬升?是越来越多新场景催生越来越多新扩展?都不是。 这条路走到这里会发现:PostgreSQL 的终极目标不是分布式的无限扩展,也不是时序或向量的单项性能巅峰,而是一个更宏大、更本质的方向——AI 原生数据库。一个能够同时处理空间、时间、关系和语义四种数据维度的数据库;一个让 AI 模型直接在数据所在地完成训练和推理的数据库;一个自己能感知工作负载、自动优化索引、自动调参的数据库;一个本身就能被 AI 智能体“使用”和“操作”的数据库。 这就是本系列收官的答案。 一、变迁简史:为什么 PostgreSQL 在 AI 时代成为首选? 1.1 2023 年:向量检索技术引爆 PostgreSQL 增长 时间回到 2023 年初,ChatGPT 的发布引发全球对 AI 应用的狂热追逐。RAG 架构迅速成为 LLM 落地的标准范式,而 RAG 的核心依赖于高效存储和检索高维嵌入向量。当时市场反应主要是两种:一是重新发明轮子——一批专用向量数据库——Pinecone、Milvus、Qdrant——迅速成为硅谷宠儿;二是让现有数据库变出来——PostgreSQL 已经有一个 2021 年发布的 pgvector 扩展,而这一年的时间点,恰好和 RAG 的热潮形成了一次完美的“范式共振”。 事实证明这不是巧合。专用向量数据库提供了更前沿的特性,但它们无法与业务数据在同一事务上下文中协同工作,凡涉及多系统联查时就要在“迁移所有数据入向量库”和“每次查询联两次系统”之间做艰难选择。pgvector 先天就在 PostgreSQL 内部运行,向量与标量数据在同一事务中,JOIN 时不需要应用层补偿。这份“开箱即用的整合”成为压倒性的优势。 接下来的两年是 PostgreSQL 在 AI 时代全面发力的两年。Stack Overflow 开发者调查显示,2023 年左右出现了“爆炸式的阶跃增长”,向量数据库这一波带飞了 PG,AI 把 PG 的增长拉到了一个新阶段。 而真正改变行业格局的,是各大云厂商的反应。2025 年,Google 正式宣布 AlloyDB AI 全面可用,将向量能力原生植入 PostgreSQL 兼容的云数据库;AWS 推出 Aurora PostgreSQL 与 SageMaker 的零 ETL 集成;Azure HorizonDB 号称“重新定义 PostgreSQL 性能极限”,AI 就写在它的底座里。这些行动从不同方向印证了同一个结论:PostgreSQL 正在成为 AI 应用开发的事实标准数据底座。 二、三阶跃迁:PostgreSQL AI 化的道路正在变成现实 2.1 第一阶:多模态融合(Multi-modal Convergence) “多模态融合”是将标量、向量、文本、JSON、GIS 等不同数据类型在同一数据库内核中统一处理。传统架构将这些数据分散在多个系统中,数据孤岛、链路冗长、权限复杂。PostgreSQL 扩展体系天然实现了多模态融合:pgvector 管理向量,PostGIS 管理地理数据,B-tree 和 GIN 管理标量和文本,所有能力协同运作。SeekDB 等 AI 原生数据库已经证明了在单一数据库内实现跨模态查询的可行性——例如“近 7 天交易超 5 万元、位置异常且行为类似历史欺诈样本”这样的复杂条件在单条 SQL 中就能完成。 2.2 第二阶:AI 驱动自治(AI-driven Autonomy) AI 驱动自治是数据库将自己的智能武装起来——让数据库“自己管自己”。工作负载感知:数据库自动识别热数据分片和冷热特征;自动索引推荐:基于历史查询模式自动创建和删除索引;资源动态分配:根据负载变化弹性调度计算和内存资源。Redgate 2026 年报告显示,AI 在数据库管理中的使用率从 15% 飙升至 44%,每年几乎翻了 3 倍。数据表明自治数据库不再是概念,而是正在快速铺开的现实。 2.3 第三阶:AI 智能体编程(Agentic Programming) 第三阶是将数据库的“使用者”从人变为 AI 智能体。Databricks 2026 年发布的《State of AI Agents》报告显示:在 Neon(Databricks 收购的云 PostgreSQL 平台)上,由 AI 智能体创建的数据库已从 2023 年 10 月的 0.1% 猛增到 2025 年 10 月的 80%;数据库分支的创建比例更是从 0.1% 暴涨至 97%。AI 智能体已在实际基础设施管理中占据主导位置。 三、云厂商的集体入局:从“兼容”到“原生” 3.1 Google AlloyDB AI:将向量嵌入数据库的深层架构 2026 年初全面推出,Google Cloud 在完整保留 PostgreSQL 兼容性的前提下重构了存储层,使事务、分析和向量三种负载在单一引擎中获得高性能。支持在复数个数据库中存储百万级向量并进行毫秒级检索。AlloyDB 已被 Regnology 等企业用于构建监管报告聊天机器人——AlloyDB 充当动态向量存储,实时索引监管指南和合规文档,合规分析师通过自然语言交互完成报告查询。Google 同时将向量搜索能力扩展到 Cloud SQL for MySQL、Memorystore for Redis 和 Spanner,在所有数据库产品中统一引入 AI 能力。 3.2 AWS 零 […]

PostgreSQL 扩展生态全景解析(第五期):分布式扩展 —— 从分片到存算分离的进化之路

PostgreSQL 扩展生态全景解析(第五期):分布式扩展 —— 从分片到存算分离的进化之路 引言:单机 PostgreSQL 的天花板 我们的系列走到了第五期。第一期我们讨论了扩展生态的宏观图景,第二期探了 GIS,第三期探了向量,第四期探了时序。它们回答的问题分别是“在哪里”“像什么”和“何时”。但还有一个更加基础的问题,在前面几期的讨论中悄然浮现—— 当数据量增长到单机存不下时,怎么办? 想象一个多租户 SaaS 平台,每个租户的数据都在同一张表里。一年后,这张表突破数十亿行。PostgreSQL 的优良设计——MVCC、索引、查询优化器——在这个规模下依然能正常工作,但服务器的 CPU、内存、磁盘 I/O 终究有上限。单机 PostgreSQL 的吞吐量和存储容量有天花板。 这个天花板,正是本期要讨论的问题:分布式扩展。 如果说 PostGIS 让 PostgreSQL“看懂”了空间,pgvector 让它“理解”了语义,TimescaleDB 让它“拥抱”了时间,那么分布式扩展则要回答一个更底层的问题——如何让 PostgreSQL 超越单机边界,跨多台服务器协同工作? 一、分片的本质与挑战 1.1 什么是分片(Sharding)? 分片,也叫水平分区,是将一张大表按某种规则拆分成多个子集,每个子集放在不同的数据库节点上。分片使得水平扩展成为可能——随着数据量增长,加入更多节点,总容量和吞吐能力也随之线性扩展。 分片方案的根本在于“数据分布策略”。通常有两种主要方式:分片键(Sharding Key)分区(如按租户 ID 将数据打散到不同节点上),以及目录服务分割(使用一个中央映射表记录数据到节点的映射关系,支持更灵活的数据放置策略,但查询需先查目录再定位,引入额外一跳延迟)。 PostgreSQL 的分片方案主要分为三类:扩展插件(如 Citus)、原生技术组合(原生分区表 + FDW)、外部代理组件(如 PgDog)。 1.2 分布式查询的挑战:跨节点 JOIN 与分布式事务 分片后,查询变得复杂。一个关键问题是 Co-location(协同放置):如果两张表都按租户 ID 分片,且分片规则一致,那么 JOIN 可以在单个节点上完成,性能最优。如果分片规则不一致,JOIN 就可能导致跨节点数据 shuffle,性能急剧下降。 另一个挑战是分布式事务与一致性。跨越多个 PostgreSQL 节点的事务,需要在所有参与节点上保持原子性。 1.3 分布式系统的权衡:CAP 定理与 PACELC 分布式系统必然面临权衡。CAP 定理指出,在一致性(Consistency)、可用性(Availability) 和网络分区容忍性(Partition Tolerance) 三者中,只能同时满足两个。PostgreSQL 原生复制模型倾向于保障 CP(一致性和分区容忍性),在网络分区时宁可暂停服务也不提供不一致的数据。 PACELC 定理则进一步指出,即便没有网络分区,系统也要在延迟(Latency) 和一致性(Consistency) 之间权衡。数据库具体做了何种取舍——选择了强一致性还是最终一致性——将直接影响应用架构设计和容错策略。 二、Citus:最成熟的云原生分布式扩展 2.1 基本架构:在无共享架构之上构建分布式集群 Citus 是 PostgreSQL 生态中应用最广泛的分片扩展,它将 PostgreSQL 从单节点转变为分布式集群。Citus 采用无共享架构,每个节点独立拥有自己的 CPU、内存和磁盘。集群由一个协调器节点和多个工作节点共同组成。应用连接协调器,协调器根据分布列的哈希值将数据路由到各工作节点,并负责并行化跨分片查询。 2.2 分布列的选择 Citus 的核心是分布列(Distributed Column)。创建分布式表时,用户需指定分布列,Citus 根据分布列哈希值决定数据落到哪个分片。 行级分片(Row-based Sharding)是最经典的方式,适用于多租户 SaaS 场景。选择分布列的关键原则是:查询必须包含分布列过滤条件。例如按 tenant_id 分片,查询 WHERE tenant_id = 123 会被路由到单个工作节点;若查询缺少分布列条件,协调器必须并行查询所有工作节点。 对于异构租户场景,Citus 自 12.0 版本引入了基于模式的分片(Schema-based Sharding)。此模式下,每个租户拥有独立的 Schema,减少应用改造量,但节点间共享资源的密度会有所降低。 2.3 协同性与参考表 协同放置是 Citus 的核心优化:如果两张分布式表具有相同的分布列和分片规则,JOIN 操作可以在各工作节点本地完成,无需数据 shuffle。 Citus 还提供参考表,将小表完整复制到每个工作节点,用于维度数据关联。例如“产品分类”表设置成参考表后,任意 JOIN 都无需跨节点数据传输,查询性能大幅提升。 2.4 Citus 14.0:将 PostgreSQL 18 的力量带到分布式集群 2026 年 2 月,Citus 14.0 发布,核心是完整适配 PostgreSQL 18。Citus 作为 PostgreSQL 扩展决定了其架构优势:PG 18 的性能增强在 Citus 集群中“自动生效”,无需额外开发。 PG 18 为 Citus 带来的关键能力包括: 异步 I/O(AIO,Asynchronous Input/Output):分片密集的分布式集群中,顺序扫描和 VACUUM 操作从 AIO 获得显著加速。 跳跃扫描:多列 B-tree 索引可跳过前缀列直接使用后置列,对多租户应用中条件不包含 tenant_id 的查询仍有性能收益。 uuidv7():时间有序的 UUID 在各分片间生成,减少跨分片索引的随机写入开销。 多数能力对用户免费,但部分复杂功能仍需 Citus 专项适配——如分布式查询中的 JSON_TABLE() 支持、DDL 传播验证、时态约束的分片一致性保证等。 2.5 列式存储:分析型负载的杀手锏 Citus 除了分片,还集成了列式存储。它利用了 PostgreSQL 的表访问方法 API,行为完全类似于普通的堆表——支持流复制、归档、pg_upgrade,弥补了早期 cstore_fdw 仅作为 FDW 的限制。压缩比高达 6-10 倍,对于数据量极大的分析场景,成本下降十分可观。 正是因为 Citus 列式存储的成熟,独立的 cstore_fdw 扩展已于 2026 年 3 月标记为弃用,官方建议现有用户迁移至 Citus 列式存储。 三、分布式生态的其他力量 3.1 PgDog:SQL 感知的自动分片代理 2026 年 2 月,PgDog 正式发布。它是一个用 Rust 编写的数据库代理,核心特点是无需修改应用代码,也无需使用数据库扩展即可实现分片。PgDog 理解 […]

PostgreSQL 扩展生态全景解析(第四期):TimescaleDB —— 当 PostgreSQL 拥抱时间之河

PostgreSQL 扩展生态全景解析(第四期):TimescaleDB —— 当 PostgreSQL 拥抱时间之河 引言:时间,数据的第四维度 前三期,我们讨论了 PostgreSQL 如何通过扩展获得三种能力:GIS(理解空间)、全文搜索(理解关键词)、向量检索(理解语义)。本期,我们要探讨的是数据的第四维度——时间。 时间数据无处不在。打开一个 Web 应用的监控面板,曲线图上每一条线都是从“过去”延伸到“现在”的大时间序列。每当用户刷新页面,新数据用写操作推入数据库,下一秒的曲线就有了新的高点。 但问题是:监控面板背后,数据库正在经历什么? 一台联网汽车每秒产生数千个数据点,一个工业物联网平台一天能积累数亿条记录。几周之后,这张表就膨胀到数十亿行。普通的 PostgreSQL 设计目标是事务处理,索引膨胀、VACUUM 压力、全表扫描——每一个都是在高频时序写入面前最先倒下的短板。 TimescaleDB 敢在 PostgreSQL 生态中正面回答这个问题。它不是一个新数据库,而是一款扩展——像 PostGIS 一样安装,然后一个普通的表变成了超表(Hypertable): CREATE EXTENSION timescaledb; CREATE TABLE sensor_data ( time TIMESTAMPTZ NOT NULL, device_id TEXT NOT NULL, temperature DOUBLE PRECISION ); SELECT create_hypertable('sensor_data', 'time'); 这就是 TimescaleDB 的精髓。你用标准 SQL 看数据,TimescaleDB 在底层处理自动分区、压缩、降采样。开发者不必成为时序数据库专家,也不必引入第二套系统。这正是 TimescaleDB(及其背后的公司 Tiger Data)提出的哲学:Start on Postgres, scale on Postgres. 从“理解空间”的 PostGIS 到“理解语义”的 pgvector,再到“理解时间”的 TimescaleDB,我们在这一系列文章中所做的,其实是在见证一件事:当数据库扩展生态足够丰富时,一个实例就能承载几乎任何数据类型——不管你问的是“它在哪里”、“它像什么”还是“它怎么随时间变化”,答案都在同一套 SQL 里。 一、时序数据的特点与普通 PostgreSQL 的“短板” 时间序列数据是一类按时间顺序排列的数据点序列,来自物联网传感器、应用性能监控、金融市场行情、用户行为日志等源源不断的生成源。这类数据有以下几个共性特征: 高写入吞吐:每秒数万甚至百万级数据点涌入 时间有序:几乎只做插入,极少更新或删除——因为过去的历史是确定的 冷热分明:近期数据被高频查询,随着时间推移逐渐进入“归档区” 聚合为主:用户很少查询单一行,常见需求是“过去 24 小时平均温度”“近一周 CPU 使用率的 95 分位值” 那么,普通的 PostgreSQL 在处理这类场景时,存在哪些短板? 单表过大:亿级行数会导致 MVCC 垃圾积压,VACUUM 压力倍增,索引也随之膨胀 时间范围查询效率低:即使有 B-Tree 索引,如果扫描跨越数亿行的范围,依然需要遍历大量数据页 缺乏自动生命周期管理:无法自动删除 30 天前的数据;要降采样,必须手工写 ETL 作业 无法内建预聚合:细粒度原始数据若要长期保存,查询性能会随数据累积直线下降 TimescaleDB 就是为了解决这些问题而生的。它是一个开源、兼容 PostgreSQL 的时序数据库扩展,在保留 PostgreSQL 全部能力(SQL、JSONB、GIS、ACID 事务)的基础上,针对时序场景新增了自动分区、数据压缩、连续聚合、列式存储和向量化执行等深度优化能力。 二、核心架构设计 2.1 Hypertable(超表):时序表的“智能分身” 超表是 TimescaleDB 的核心抽象。开发者面向超表写 SQL 就像操作普通表,TimescaleDB 在底层根据时间(可选空间维度)自动将数据划分为一系列“块”(Chunk)。 在 TimescaleDB 的实现中,Chunk 并不是虚拟概念——每个 Chunk 就是一张标准的 PostgreSQL 表。超表相当于一个智能的分区管理层,自动将插入路由到正确的 Chunk,在查询时只扫描与时间范围相关的 Chunk。这种按时间分区的能力使得查询不受全表扫描拖累,读取和写入性能随着数据量增长仍然保持线性稳定。 空间分区(Space Partitioning) 是超表又一个王牌特性。假设传感器数据表包含 device_id,可以在创建超表时额外按 device_id 做哈希分区。查询 WHERE device_id = 'sensor_001' AND time > ... 时,TimescaleDB 直接定位到对应时间段的 Chunk 再裁剪到具体设备。时间 + 空间双分区让时序数据库中常见的复合过滤条件性能大幅提升。 2.2 Hypercore 列式存储引擎:行存储的灵活与列存储的性能兼顾 TimescaleDB 在 2.18 版本开始引入 Hypercore——一个混合行-列存储引擎。 为什么混合存储对时序数据如此重要?现代时序工作负载的特点决定它需要兼顾两种完全不同的访问模式:既要支持高吞吐、低延迟的写入(行式存储为每次写入维护完整记录);又要支持筛选特定列的大范围聚合分析(列式存储只需要读取被查询列的数据块)。传统数据库必须在 OLTP 和 OLAP 之间二选一,而 Hypercore 将两者融合在一个引擎中。 Hypercore 的数据流转路径是:数据插入时,行式存储层负责高吞吐写入(最近的 Chunk 总是行存储)。当 Chunk 被标记为可压缩时,TimescaleDB 在后台将数据转换为列式存储,空间占用显著降低。用户在查询时无需感知二者边界,TimescaleDB 会决定从行式还是列式存储中读取。 ⚠️ 注意:Hypercore 曾以 Table Access Method(TAM)形式存在(v2.18.0),但在 2.22.0 中完全移除,原因是 B-tree 架构的 TAM 性能不及预期,而列存储引擎已足够成熟。若从 v2.21.0 或更早版本升级,需先执行 ALTER TABLE ... SET ACCESS METHOD heap 迁移现有数据,否则升级会被阻塞。这提醒我们:即使看似的“下一代存储技术”也可能被废弃,生产环境采用前沿特性前务必评估长期维护成本。 2.3 Chunk 与块大小调优 Chunk 大小的设置直接影响插入和查询性能。TimescaleDB 的默认块大小为 7 天,但最佳做法是确保单个 Chunk 的大小约占主内存的 25%,这样最近的热数据能常驻内存,避免频繁磁盘 I/O。 […]

PostgreSQL 扩展生态全景解析(第三期):pgvector —— 当关系型数据库“理解”语义

PostgreSQL 扩展生态全景解析(第三期):pgvector —— 当关系型数据库“理解”语义 引言:从“匹配关键词”到“理解含义” 继续我们的扩展之旅。如果说第二期的 PostGIS 让数据库“看懂”了地图,解决了“我在哪里”的几何空间问题,那么本期的 pgvector 则要回答一个更抽象的问题:“它像什么?” 想象一个电商场景。用户输入“送长辈的礼盒”。普通的关键词搜索如果只匹配商品标题,会漏掉那些标题不含“礼盒”二字却符合“挑选给长辈”这一意图的商品。而一个能“理解”语义意图的系统,则能穿透字面的屏障,在更深处定位到真正的需求。 pgvector 正是在这样的背景下应运而生的。它把文本、图像等信息转化成高维向量(Embedding),让数据库不仅能存和查,还能通过向量运算进行语义相似性搜索。 而 pgvector 真正的变革力量在于——它让这一切在标准 SQL 内就以“原生”方式实现了: CREATE EXTENSION vector; CREATE TABLE products ( id bigserial PRIMARY KEY, name text, description text, embedding vector(1536) -- AI 生成的 1536 维向量 ); CREATE INDEX ON products USING hnsw (embedding vector_cosine_ops); -- 寻找语义最相似的商品 SELECT * FROM products ORDER BY embedding <=> '[0.012, -0.003, ...]' -- 查询的向量表示 LIMIT 10; 没有引入新的技术栈,没有额外的数据同步管道,就在 PostgreSQL 内部,语义搜索的能力生长了出来。pgvector 是如何做到让关系型数据库“理解”向量的?这正是本期要深入探究的核心。 一、核心概念:向量是什么?pgvector 如何定义“相似”? 1.1 向量类型:不止一种“数组” pgvector 提供了多种向量数据类型,以适应不同精度和存储效率的需求。 类型 元素 单元素大小 最大维度 存储公式(近似) 适用场景 vector(n) float32 4 字节 2,000(索引)/ 16,000(存储) 4×n + 8 字节 默认类型,平衡精度与性能 halfvec(n) float16 2 字节 4,000 / 16,000 2×n + 8 字节 超大规模数据集,节省 50% 存储 bit(n) 二进制位 1/8 字节 64,000 n/8 + 8 字节 哈希签名、二进制向量 sparsevec(n) 稀疏向量 索引+值 ~1,000 non-zero 8×n_nz + 16 字节 高维稀疏嵌入(如词袋模型) 每种类型都有固定的维度上限,创建时需明确指定。选择何种类型需要权衡:vector 精度最高,halfvec 节省存储但精度减半,sparsevec 则专为绝大多数元素为零的稀疏向量设计。 存储机制的巧妙之处:当向量长度适中时,PostgreSQL 会将向量数据直接内联存储在同一条数据行的页面上,避免额外的 TOAST 读取 I/O,让向量和数据保持在同一物理页。对于超长向量,PostgreSQL 会自动压缩或将其移至 TOAST 表,以空间换时间。 ⚠️ 小提示:HNSW 索引对 vector 类型有 2000 维的上限,4096 维的 BGE 模型需改用 halfvec。sparsevec 自身不支持 HNSW 索引,通常需要配合 IVFFlat 或精确搜索。 1.2 三种核心距离:选对度量,事半功倍 pgvector 提供了三种核心的距离运算符,对应不同的业务含义,决定了检索结果的“好坏”。 运算符 距离类型 语义 取值范围 适用场景 <-> L2(欧几里得)距离 空间中两点的直线距离,对长度敏感 [0, ∞) 物理位置、传感器数据 <=> 余弦距离 只关心方向(夹角余弦),不关心长度 [0, 2] 文本语义、图像内容、推荐系统 <#> 内积(取负) 角度与长度都敏感 (-∞, ∞) 未归一化的向量、最大内积搜索(MIPS) 选型原则:OpenAI/Cohere 主流嵌入模型已默认归一化,此时余弦距离 <=> 是语义搜索的标准选择;L2 <-> 适合保留长度信息的场景还是空间坐标;内积 <#> 则在推荐系统中常用,因为用户向量和物品向量的模长可以编码交互频率或流行度。若不确定,可对几条已知的正负样本分别排序,观察哪种度量将正确答案前置。 ⚠️ 最常见的坑——索引失效:pgvector 索引在创建时绑定了一个具体的操作符类(operator class),用 vector_cosine_ops 建索引后查询必须用 <=>,否则索引失效,退化为全表扫描。有团队因此遭遇了 600 倍的性能暴跌。排查技巧:先看 EXPLAIN […]

PostgreSQL 扩展生态全景解析(第二期):PostGIS —— 把数据库变成 GIS 背后的秘密

PostgreSQL 扩展生态全景解析(第二期):PostGIS —— 把数据库变成 GIS 背后的秘密 引言:当数据库学会“看地图” 回顾上一期,我们提到了一条神奇的 SQL:CREATE EXTENSION postgis;。这条命令就像给数据库装上了一个“地理大脑”,让它突然能计算距离、判断多边形包含关系、规划最优路径。 但这里藏着一个根本性的追问:一个为表格设计的数据库,究竟是怎么变得“懂地理”的? 不妨做一个思想实验。当一个电商 App 要找出“用户附近 3 公里内的自提点”,普通的数据库会怎么做?它会用经纬度两个字段,对全表逐行计算距离,再排序。百万级数据量,并发一上来,CPU 直接拉满。 而装了 PostGIS 的数据库,解法完全不同: SELECT * FROM pickup_points WHERE ST_DWithin( geom, ST_SetSRID(ST_MakePoint(116.40, 39.90), 4326), 3000 ); 同样是一条 SQL,PostGIS 能在毫秒级返回结果。这背后发生了什么?本期就从存储、索引和计算三个维度,拆解 PostGIS 的神奇之处。 一、核心概念:PostGIS 是怎么“看懂”地理数据的? 1.1 数据类型:geometry 与 geography 的选择 PostGIS 提供了两种核心空间数据类型。 geometry 采用平面笛卡尔坐标系,将地球近似为平面,单位是坐标单位(度或米),计算快但不精确。处理大范围跨经纬度时,会出现距离和面积误差。在 PostGIS 的 300 多个函数中,它是默认类型。 geography 基于球面模型,单位固定为米,自动在 WGS84 椭球上计算真实距离和面积,结果精确但计算开销大。 选型原则:GPS 坐标存储用 geography(单位米,结果可对齐)。但大范围点密度图的 KNN 建议用 geometry,因为 geography 的球形距离计算开销会拖慢整体速度。 1.2 坐标系与 SRID:地理数据的第一步 SRID(空间参考标识符)是 PostGIS 最容易被忽略却最重要的一环。每个几何对象必须绑定 SRID,坐标才有物理意义。常用 SRID 包括: 4326(WGS84):GPS 标准,经纬度度为单位,是全球通用的“地理坐标系” 3857(墨卡托):前端地图(如高德/谷歌 Web 版)专用,是投影坐标系,单位为米 4490(CGCS2000):中国国家大地坐标系,国内政企 GIS 强制标准 在 PostGIS 内部,EWKT 扩展格式可以声明 SRID(如 SRID=4326;POINT(116.40 39.90)),而标准 WKT 做不到。 教训:多源数据整合时 SRID 必须统一计算,否则 ST_Distance 可能算出“离谱结果”。 1.3 核心空间关系与函数 PostGIS 内置了完整的空间关系判断,包括: ST_Intersects(相交)、ST_Contains(包含)、ST_Within(在内)、ST_DWithin(距离内)、ST_Touches(接触)、ST_Crosses(穿越) 这些函数大多支持 GiST 索引,检索效率远高于常规 B-Tree 上的 ST_Distance 暴力比较。 1.4 几何构建与输出 类别 典型函数 场景 几何构建 ST_MakePoint(经度,纬度) 经纬度 → 点 坐标系绑定 ST_SetSRID(geom,4326) 绑定 WGS84 批量轨迹 ST_MakeLine(geom ORDER BY time) GPS 点串成轨迹 WKT 转换 ST_GeomFromText('POINT(116 39)',4326) WKT → 数据库格式 ST_GeoHash ST_GeoHash(geom,6) 空间数据粗粒分片/热力图 ⚠️ 长年高频错误:PostGIS 内部强制要求 x=经度 在前,y=纬度 在后(POINT(116 39) 表示东经 116°,北纬 39°),颠倒会导致“坐标飞到海外”。 二、索引:为什么 PostGIS 的 GiST 又快又准? 空间索引是所有地理查询的基石。PostGIS 默认使用 GiST 索引,核心逻辑是:把所有复杂几何体简化为最小外包矩形(Bounding Box),用这些精简过的矩形构建树状结构,命中后再进行精确计算。 2.1 索引陷阱:为什么索引建了却没生效? -- ❌ 正确过滤但不用索引 SELECT * FROM locations WHERE ST_Distance(geom, ST_MakePoint(116.40, 39.90)) < 1000; -- ✅ 走索引的正确姿势 SELECT * FROM locations WHERE ST_DWithin(geom, ST_MakePoint(116.40, 39.90), 1000); ST_Distance 每行都要算精确距离,无法利用索引框过滤。而 ST_DWithin 先用外包矩形快速排除绝大部分数据,极高概率命中索引。90% 的空间查询慢,不是因为数据量大,而是 ST_Distance 没有套上 ST_DWithin 做外层剪枝。 2.2 坐标系不一致导致索引失效 -- ❌ 错误示范 […]
Recent Posts

HiddenMerit Daily · Issue 60

# 📊 HiddenMerit Daily · Issue 60 > **Focus on Database Frontiers, Practical Insights for DBAs** > July 22, 2026 | 5 Selected Global Breaking News ## 01|Oracle Releases Largest Quarterly Patch in History: 1,449 Patches Fix 1,235 CVEs, 261 Critical On July 21, Oracle released its July 2026 Critical Patch Update (CPU), setting a record for the largest single patch release in the company’s history. This CPU contains **1,449 security patches** fixing **1,235 independent CVEs** across 32 Oracle product families, of which **261 patches are rated Critical**. **Patch Distribution by Product Family**: | Product Family | Patches | Remotely Exploitable Without Authentication | |—————-|———|———————————————| | Oracle E‑Business Suite | 410 | 45 | | Oracle Fusion Middleware | 355 | 219 | | Oracle Communications | 168 | 122 | | Oracle MySQL | 54 | 9 | | Oracle Database Server | 15 | 6 | **Context for This Patch**: Oracle had already issued an urgent “Prepare Now” warning a week earlier, emphasising that AI is fundamentally lowering the barrier to discovering and exploiting vulnerabilities – frontier AI models can analyse software changes, reverse‑engineer security patches, and develop attack paths at unprecedented speed. Oracle has collaborated with state‑of‑the‑art […]

HiddenMerit Daily · Issue 59

# 📊 HiddenMerit Daily · Issue 59 > **Focus on Database Frontiers, Practical Insights for DBAs** > July 21, 2026 | 5 Selected Global Breaking News ## 01|Oracle Issues Urgent Warning: July 21 Release Update to Fix Large Number of High‑Risk Vulnerabilities, Immediate Deployment Recommended On July 13, Oracle issued an urgent security warning, strongly recommending that all customers running supported Oracle Database versions (including Oracle Database 19c and Oracle AI Database 26ai) immediately test and deploy the Release Update (RU) after its release on July 21. **Background**: New frontier AI models are significantly lowering the barrier to discovering and exploiting software vulnerabilities – these models can identify weaknesses, analyse software changes, reverse‑engineer security patches, and develop potential attack paths at unprecedented speed and scale. AI models are also becoming increasingly adept at combining multiple weaknesses across the application and data stack into complex attacks, even when individual weaknesses do not themselves pose a serious risk. As a result, protecting systems solely at the network or application layer is no longer sufficient; enterprises must protect the entire technology stack. **Fixes Included in This RU**: Oracle has collaborated with state‑of‑the‑art models from Anthropic and OpenAI to proactively identify and fix potential […]

HiddenMerit Daily · Issue 58

# 📊 HiddenMerit Daily · Issue 58 > **Focus on Database Frontiers, Practical Insights for DBAs** > July 20, 2026 | 5 Selected Global Breaking News ## 01|CAICT: Domestic Databases Enter Core System “Deep Water,” AI‑Native Leads New Industry Landscape On July 9, at the 2026 Trustworthy Database Development Conference, CAICT released the “Database Development Research Report (2026).” The report notes that domestic databases have basically completed peripheral system replacement and have officially entered the **critical business system breakthrough phase**. **Key Data**: – The global database market reached **$131.6 billion** in 2025 (approximately RMB 894.09 billion). – The Chinese database market reached **$9.49 billion** in 2025 (approximately RMB 64.48 billion), and is expected to reach **RMB 97.974 billion** by 2028, with a CAGR of 13.06%. – The number of domestic database vendors has shrunk from a peak of 167 to 94, with a clear head‑concentration effect and an intensifying “Matthew effect.” **AI‑Native Becomes the Main Theme**: The report points out that database technology is accelerating its evolution toward the **AI‑native direction**, and the global database industry is entering a new phase of landscape restructuring. The role of databases is upgrading from “underlying support systems” to “core engines enabling intelligent decision‑making […]

HiddenMerit Daily · Issue 56

# 📊 HiddenMerit Daily · Issue 56 > **Focus on Database Frontiers, Practical Insights for DBAs** > July 6, 2026 | 5 Selected Global Breaking News ## 01|Kingware Releases Manufacturing Scenario Database Evolution White Paper: SQL Server Replacement Enters “Deep Water” On July 5, CETC Kingware published a technical article titled “Database Evolution in Manufacturing Scenarios: How Kingware Replaces SQL Server,” pointing out that the data surge on industrial shop floors has exceeded the processing capacity of single‑node systems. Traditional database architectures that rely on vertical scaling are facing unprecedented performance challenges. Over the next 1‑3 years, manufacturing enterprises will no longer face only the “choice of replacement,” but must answer the strategic question: “How do we build an autonomous data foundation in the context of de‑IOE?” **Three Paradigm Shifts**: 1. **Hybrid Workloads Become the Norm**: The IT architecture of modern factories is shifting from separated OLTP and OLAP to HTAP mode. The same data system must simultaneously handle tens of thousands of device instruction writes per second and minute‑level production report analysis. 2. **Distributed Architecture Becomes a Hard Requirement**: When a single table exceeds 100 million rows with daily increments exceeding 1 million rows, the index maintenance cost of […]