13 深入专题:SQL 特性与版本演进
这一篇聚焦 PostgreSQL 在 SQL 标准与版本演进上的关键能力,涵盖 JSON/JSONPath、CTE、窗口函数、生成列、COPY、MERGE 等高频特性,以及各版本间的行为变化。
PostGIS 的坐标系统(BD09、GCJ02、WGS84)转换怎么做?
WGS84 是 GPS 使用的世界坐标系;GCJ02 是国测局“火星坐标”,国内地图(高德、腾讯)使用,在 WGS84 基础上加密偏移;BD09 是百度在 GCJ02 上再加密的坐标系。PostGIS 中转换用 ST_Transform 在不同 SRID 间转换,但 BD09/GCJ02 的加密偏移无公开公式,需用插件或自定义函数实现近似转换(如扩展里提供的转换函数),不能简单用 ST_Transform 处理。
PostgreSQL 12 支持哪些 SQL/JSON 标准特性?
PG12 开始支持 SQL 2016 标准的 SQL/JSON 特性,包括 JSON_EXISTS、JSON_QUERY、JSON_VALUE 等以 jsonpath 为基础的 SQL 标准接口。jsonpath 是 SQL/JSON 的核心路径语言,用 $ 表示根、.key 取对象成员、[*] 取数组元素,配合 exists、type、size 等方法。这套标准让 JSON 查询能力从 PG 自定义操作符向 SQL 标准对齐,后续 PG15/16 又补充了 JSON_TABLE、JSON 构造器和更多 jsonpath 方法。
PostgreSQL 12 的 COPY FROM 支持 WHERE 过滤吗?怎么用?
支持。PG12 扩展了 COPY FROM 语法,可以在导入时加 WHERE condition 过滤记录,例如 COPY t_from FROM ‘/tmp/t_to’ WHERE id<100,只导入满足条件的行。在此之前要实现过滤只能先预处理输入文件,或全量导入后再在库里删除。它支持随机采样、按数据列条件过滤等,对大多数简单场景是低开销的替代方案,只对 FROM 方向有效。
PostgreSQL 12 的 CTE materialized 控制是什么?
PG12 起 CTE 支持用户用 MATERIALIZED / NOT MATERIALIZED 关键字控制是否物化。此前(PG11 及更早)WITH 子查询总是被物化(先算完存临时结果),PG12 默认改为让优化器内联优化,但允许用户显式指定。MATERIALIZED 强制物化(隔离优化、避免多次重算),NOT MATERIALIZED 允许内联。这对控制复杂 CTE 的执行计划和性能很有用。
PostgreSQL 12 的 DROP OWNED BY 是什么?
DROP OWNED BY 用户名 删除该用户拥有的所有对象(表、视图、函数、序列等),但不删除用户本身。它常用于清理用户、回收权限前的对象转移,配合 REASSIGN OWNED(转移对象所有权给其他用户)和 DROP USER 完成用户下线流程。注意 DROP OWNED 会真正删除对象,需谨慎确认。
PostgreSQL 12 的 SQL 采样比例设置(log sample)是什么?
PG12 支持对事务采样记录日志,用 log_transaction_sample_rate 设置采样比例,只记录部分事务的 SQL 日志,减少全量 SQL 日志的开销。PG13 又增加 log_min_duration_sample,对超过指定耗时的语句按比例采样。这些让慢查询/审计日志在“完整记录”和“性能开销”之间平衡。
PostgreSQL 12 的 SSL clientcert verify-full 是什么?
PG12 的 pg_hba.conf clientcert 选项新增 verify-full,要求客户端证书的 CN 必须与登录用户名完全匹配(verify-ca 只验证 CA 签发)。verify-full 提供更强的身份绑定,防止持有合法 CA 证书但身份不符的客户端登录,是 mTLS 认证的安全增强。
PostgreSQL 12 的 data_sync_retry 是什么?
data_sync_retry 是 PG12 引入的参数,解决 OS 层 write back failed status 不可靠的问题,控制 fsync 失败后的重试行为。底层存储(如 NFS、某些 SAN)的写回失败状态可能不可靠,data_sync_retry 让 PG 在 sync 失败时重试而非立即 panic,提升可靠性。
PostgreSQL 12 的 integerset 数据结构(Simple-8b)是什么?
PG12 引入 integerset 数据结构,用于高效存储 64 位整数集合,内部采用 Simple-8b 压缩算法(把多个小整数打包到一个 64 位字里)。它用于 GIN 索引 posting list 等需要存储大量有序整数的场景,比普通数组更省空间、更快。这是存储引擎底层的数据结构优化。
PostgreSQL 12 的 parallel 递归查询支持吗?
PG12 时期递归查询(WITH RECURSIVE)不支持并行执行,是并行计算的限制之一。递归 CTE 的 work table 迭代有先后依赖关系,每轮必须基于上一轮结果,难以并行化。相关并行优化(如并行 CTE、并行递归)是持续研究方向,PG18 才在窗口/递归性能上有提升。递归查询的并行化至今仍是 PG 的短板。
PostgreSQL 12 的 pgbench 一条 SQL 最多绑定 256 个变量是什么?
PG12 起 pgbench 自定义压测脚本的一条 SQL 最多可绑定 256 个变量,替代此前较少的上限。这让复杂压测脚本(多参数 SQL、多条件查询)能绑定更多变量,模拟更真实的业务 SQL。变量通过 :varname 引用,\set 赋值。
PostgreSQL 12 的 psql help 支持 manual url 显示是什么?
PG12 的 psql \help 支持显示 manual url 链接(在线文档地址),让用户从命令行直接跳转到对应 SQL 命令的官方文档。这方便查阅命令的详细说明和示例,提升 psql 的使用体验。
PostgreSQL 12 的 ssl_min/max_protocol_version 是什么?
PG12 起支持 ssl_min_protocol_version 和 ssl_max_protocol_version 参数,控制允许的 SSL/TLS 协议版本范围(如 TLSv1.2、TLSv1.3),禁用不安全的旧协议(SSLv3、TLSv1.0)。这用于强制使用安全协议,满足安全合规要求,防止降级攻击。
PostgreSQL 14 的 COPY 支持 visibility map 及时更新是什么?
PG14 的 COPY 导入时及时更新 visibility map(可见性映射),标记全可见页,减少后续 vacuum 的工作量。visibility map 记录哪些页对所有事务可见,vacuum 据此跳过已全可见的页。COPY 导入的新数据页都是全可见的,及时更新 VM 让 vacuum 更快,也利于 index-only scan。
PostgreSQL 14 的 Unicode 组合字符性能优化是什么?
PG14 优化了后端 Unicode 分解/重组(decomposition/recomposition)的性能。Unicode 规范化(如 NFC)涉及字符分解和重组,是 collate、大小写转换、normalize 的底层操作,某些语言文本处理时开销较大。优化后这部分性能提升,改善国际文本的处理速度。
PostgreSQL 14 的 abstract Unix-domain socket 是什么?
PG14 支持 abstract Unix-domain socket(Linux 特有的抽象命名空间 socket),用 @ 前缀命名,不占用文件系统路径。相比传统 Unix socket 需要文件路径,abstract socket 不受路径长度、文件权限限制,关闭时自动清理,适合容器化环境(socket 文件不落地)。这增强了 Linux 上 socket 的灵活性和安全性。
PostgreSQL 14 的 bit_count 和 bit_xor 是什么?
bit_count(x) 计算整数的二进制表示中 1 的个数(PG14),bit_xor 是位异或聚合函数(PG14 新增)。bit_count 用于统计置位位数(如权限位、特征位统计);bit_xor 对一组值做异或聚合,可用于校验、去重(异或相同值抵消)等场景。它们补齐了 PG 的位运算函数族。
PostgreSQL 14 的 check_client_connection_interval 是什么?
check_client_connection_interval 是 PG14 协议层的心跳检测参数,运行长查询时周期性检查客户端连接是否还存活(检测 POLLHUP/POLLRDHUP),若客户端已离线可快速中断还在运行的长 SQL。此前客户端断开后,服务端可能还在空跑长查询浪费资源,直到查询结束才感知。该参数让服务端及时回收客户端已断开的查询。
PostgreSQL 14 的 compute_query_id 与 pg_stat_statements 什么关系?
pg_stat_statements 依赖 query id 来聚合相同 SQL 的统计。PG14 起 query id 的计算由内核统一提供(compute_query_id 控制),pg_stat_statements 复用内核的 query id 而非自己再算一遍。统一 query id 后,多个需要 SQL 指纹的组件(统计、审计、监控)共享一致的 ID,能跨视图关联,也避免了重复计算开销。
PostgreSQL 14 的 hash 函数生成代码增强(PerfectHash)是什么?
PG14 用 src/tools/PerfectHash.pm 生成完美的 hash 函数,用于内部查找表(如关键字的 hash 查找),减少 hash 冲突、提升查找效率。PerfectHash 为静态键集生成无冲突的哈希函数,相比通用 hash 表更快、更省空间,是内核内部性能优化。
PostgreSQL 14 的 log_connections 打印 pg_hba 行号有什么作用?
PG14 的 log_connections 增强,打印连接命中了 pg_hba.conf 的第几行规则、使用什么认证方法,方便判断客户端是通过哪条规则认证进来的。当有多条 pg_hba 规则时,连接可能命中错误的规则导致认证异常,打印行号和认证方法让 DBA 能快速定位问题规则,是连接排障的重要辅助。
PostgreSQL 14 的 pg_database_owner 默认角色是什么?
pg_database_owner 是 PG14 新增的预定义角色,表示“当前数据库的 owner”,可把权限授予它,从而把权限授予“这个库的 owner”这一抽象身份,而非某个具体用户。这样当库 owner 变更时,权限自动跟随新的 owner,避免逐个改授权。它简化了多租户和数据库 owner 变更场景的权限管理。
PostgreSQL 14 的 pg_stat_wal 视图是什么?
pg_stat_wal 是 PG14 新增的统计视图,统计 WAL 相关的指标(WAL 生成量、WAL 写、WAL 同步次数和时间、WAL 满页写等)。它让 DBA 能量化 WAL 的活动强度,评估 WAL 吞吐、checkpoint 频率、wal_sync 开销,是分析写放大和复制负载的依据。
PostgreSQL 14 的 pg_wait_for_backend_termination 函数是什么?
pg_wait_for_backend_termination(pid, timeout_ms) 发送终止信号给指定进程,并等待最多 timeout 毫秒,若进程未在超时内终止则返回 false 并告警。这是 kill 会话的增强,此前 pg_terminate_backend 发信号后立即返回,无法知道进程是否真的退出。新函数让会话终止可控、可确认,避免 kill 后残留进程。
PostgreSQL 14 的 pgbench gset 支持 SQL 结果存变量是什么?
pgbench 的 \gset 元命令把上一条 SQL 查询的结果存入 pgbench 变量,PG12 起支持(一条 SQL 最多绑定 256 个变量)。这让压测脚本能根据查询结果动态决定后续操作,模拟依赖查询的业务逻辑,例如先查用户余额再决定转账金额。gset 把 pgbench 从简单压测提升为可编程的业务负载仿真工具。
PostgreSQL 14 的 pgbench 冒号常量和 permute 随机函数是什么?
PG14 的 pgbench 增强:支持冒号常量(如 :client_id 之外的时间戳常量),以及 permute(i, size, seed) 随机函数,返回 i 经过随机映射后在 [0,size) 的值。permute 用于生成可复现的随机分布(如均匀打散键值),避免压测数据局部热点。这些增强让 pgbench 能模拟更真实的负载分布。
PostgreSQL 14 的 psql 快捷命令 df/do 支持参数输入是什么?
PG14 的 psql 快捷命令 \df、\do 支持按参数类型筛选函数和操作符,例如 \df pattern 可加参数类型限定,只列出匹配签名的函数/操作符。此前这些命令只按名字模式过滤,无法按参数类型精确定位重载函数。支持参数输入后,查找某个特定签名的函数/操作符更精确。
PostgreSQL 14 的 query id(SQL 指纹)是什么?
PG14 支持计算 SQL 指纹(query id),把规范化后的 SQL 生成唯一 ID,GUC compute_query_id 控制开关。query id 让同一条 SQL(忽略常量差异)在不同会话、不同统计视图(pg_stat_statements、pg_stat_activity)间关联起来,是 SQL 性能分析、审计、追踪的基础。规范化会把常量替换为占位符,使功能等价的 SQL 归为同一指纹。
PostgreSQL 14 的 recovery_init_sync_method=syncfs 是什么?
PG14 引入 recovery_init_sync_method 参数,可选 syncfs 方式,在崩溃恢复时用 syncfs 系统调用一次性同步整个文件系统,而非逐个文件 open+fsync。当表很多时,逐个 open 文件非常慢,syncfs 只同步一次,大幅加速恢复。需 Linux 新内核支持。
PostgreSQL 14 的 remove_temp_files_after_crash 是什么?
remove_temp_files_after_crash 是 PG14 的 GUC,控制 backend 崩溃重启后是否自动清理残留的临时文件。排序、hash join 等操作会落盘临时文件,进程崩溃时可能残留,占空间。默认清理这些残留临时文件,避免磁盘被垃圾文件占满。
PostgreSQL 14 的 unistr 和字符串 Unicode 处理常用函数有哪些?
常用 Unicode/字符串处理:unistr() 还原 Unicode 转义;CHR(n) 按码点生成字符;ascii() 取首字符码点;E’…’ 字符串支持 \uXXXX 转义;normalize() 做 Unicode 规范化(NFC/NFD)。这些配合用于国际文本清洗、特殊字符处理、大小写转换(lower/upper/CASEFOLD)。PG14 起 unistr 让 Unicode 转义书写更直接。
PostgreSQL 14 的 unistr 和字符集相关的 escape 处理有哪些?
PG14 的 unistr() 还原 Unicode 转义字符串(如 unistr(’\0061’) 返回 ‘a’),配合 E’…’ 字符串的转义、CHR() 按码点生成字符等,构成字符转义处理的完整工具集。它们用于在 SQL 里书写控制字符、不可见字符和特殊 Unicode 字符,是文本清洗和国际字符处理的常用函数。
PostgreSQL 14 的增量排序(incremental sort)支持窗口函数是什么?
PG14 起窗口函数支持 incremental sort(增量排序)。当数据已按部分排序列有序(如已按 partition by 列有序),只需在每组内对 order by 列做小范围排序,而非全局全量排序。incremental sort 利用已有有序性,减少排序数据量和内存占用,对窗口查询(尤其分区多、每区数据少)有显著加速。
PostgreSQL 15 的 COPY text 格式支持 HEADER 是什么?
PG15 起 COPY 的 text 格式也支持 HEADER 选项,即在 text 格式文件第一行写入列名头。此前 HEADER 主要用于 CSV 格式,text 格式没有表头支持。增加 HEADER 后,text 格式导出的文件自带列名,便于人工查看和工具解析,与 CSV 行为对齐。
PostgreSQL 15 的 COPY 支持 HEADER match(列名匹配)是什么?
PG15 的 COPY FROM / file_fdw 支持 header match,把文件第一行作为列名,与目标表列名匹配后按名对应导入,而非按位置对应。这避免了源文件列顺序与表不一致时导入错列的问题,导入更稳健。此前 HEADER 只是跳过第一行,列仍按位置对应。
PostgreSQL 15 的 CustomScan 支持 projections 是什么?
PG15 允许 CustomScan provider 声明是否支持投影(projections),即自定义扫描节点能否只输出需要的列。此前 CustomScan 通常输出整行,投影下推不充分。支持投影后,扩展自定义的扫描节点(如 FDW 的并行扫描、向量扫描)可只返回所需列,减少数据传输和计算,是扩展点性能优化。
PostgreSQL 15 的 MERGE INTO 与 ON CONFLICT 有何区别?
ON CONFLICT(INSERT … ON CONFLICT)只能处理 INSERT 时的唯一约束冲突,语义是“插入冲突则更新”;MERGE 更通用,用 WHEN MATCHED / WHEN NOT MATCHED 分支表达匹配更新、不匹配插入,且 PG17 支持 WHEN NOT MATCHED BY SOURCE 做删除。MERGE 还能关联源表和目标表的多列条件,ON CONFLICT 只能基于唯一约束。对需要“同步源数据到目标表(增删改全量)”的 ETL 场景,MERGE 是标准且更强的选择。
PostgreSQL 15 的 NULLS NOT DISTINCT 和 UNIQUE 约束的关系是什么?
UNIQUE 约束默认把 NULL 视为彼此不同(NULLS DISTINCT),因此允许多行 NULL。PG15 起支持 UNIQUE NULLS NOT DISTINCT,把 NULL 当作普通等价值,只允许一行 NULL。这解决了“业务上希望某列至多一行 NULL”的诉求,是唯一约束对 NULL 语义的可选项扩展。
PostgreSQL 15 的 NUMERIC scale 负数的应用场景是什么?
NUMERIC scale 为负表示小数点左侧舍入,如 NUMERIC(10, -2) 精确到百位,12345 存储为 12300。这用于金额以百/千为单位记账、数量级取整、科学计数等场景,避免应用层手工舍入。PG15 把 scale 范围扩展到 -1000~1000,覆盖更大精度的取整需求。
PostgreSQL 15 的 PG 内置逻辑订阅 worker 统计视图是什么?
PG15 新增 pg_stat_subscription_workers 视图,统计逻辑订阅端的 worker 状态(apply worker、table sync worker 等),观察订阅的并行应用进度、各 worker 的延迟和状态。逻辑订阅可配置多个 apply worker 并行应用变更,该视图让 DBA 能监控并行度和同步进度,是逻辑复制运维的必备视图。
PostgreSQL 15 的 PRNG API 替代 random API 是什么?
PG15 预览引入 PRNG(伪随机数生成器)API,用更好的随机数算法替代原有 random() 的 API。新 API 提供可指定种子、可复现、质量更高的随机数生成,适合测试数据可复现、加密相关(配合更好的熵源)等场景。它解决了 old random API 算法单一、无法注入种子的问题。
PostgreSQL 15 的 analyze 支持 prefetch 加速是什么?
PG15 的 ANALYZE 支持 prefetch 预读,用 maintenance_io_concurrency 控制,提前把要采样的数据页读入 buffer,加速统计信息收集。ANALYZE 需要扫描大量页面,预读能减少随机读等待,缩短大表统计信息收集时间。此前 prefetch 主要用在位图扫描,扩展到维护操作是性能提升。
PostgreSQL 15 的 auxproc 代码独立是什么?
PG15 把辅助进程(auxiliary process,如 bgwriter、checkpointer、walwriter 等)的代码从 postmaster 中独立出来,重构了辅助进程的管理结构。这提升了代码可维护性,为后续辅助进程的扩展和 AIO worker 等新辅助进程的引入奠定基础。
PostgreSQL 15 的 in-place tablespace 和 pg_tblspc 相对路径是什么?
PG15 支持 in-place tablespace,允许 pg_tblspc 目录使用相对路径引用表空间,简化表空间的管理和迁移。in-place tablespace 把表空间放在数据目录内或相对位置,便于容器化、可移植部署。此前表空间多通过符号链接指向绝对路径,相对路径让数据目录整体移动时表空间引用仍有效。
PostgreSQL 15 的 log destination 支持 jsonlog 格式是什么?
PG15 起 log_destination 支持 jsonlog 格式,日志以 JSON 结构化输出,便于日志采集系统(ELK、Loki 等)直接解析。此前日志是文本或 CSV 格式,JSON 格式字段化、可扩展,机器解析更友好。这对日志分析、告警、审计场景是重要改进。
PostgreSQL 15 的 pg_walinspect 插件是什么?
pg_walinspect 是 PG15 引入的插件,提供 SQL 函数接口解析 WAL 日志内容(类似 pg_waldump 但用 SQL 调用),可查看 WAL 记录的类型、涉及的 relation、LSN 等信息。这让 WAL 内容分析无需命令行工具,直接 SQL 查询,方便排查复制延迟、WAL 膨胀、逻辑解码等问题。
PostgreSQL 15 的 regexp_xxx 系列函数对齐 Oracle 是什么?
PG15 预览增强了 regexp 系列函数,对齐 Oracle 的 REGEXP_SUBSTR、REGEXP_INSTR、REGEXP_COUNT、REGEXP_REPLACE 等语义和参数位置,降低 Oracle 迁移到 PG 的改写成本。PG 原本有 POSIX 正则操作符(、、!~)和 regexp_ 函数,但对齐 Oracle 后,去 O 迁移时正则相关代码改动更少。
PostgreSQL 15 的 unlogged/logged sequence 是什么?
PG15 起 sequence 支持 unlogged 和 logged 两种模式,可显式指定(ALTER SEQUENCE … SET LOGGED/UNLOGGED)。unlogged sequence 不写 WAL、推进更快,但崩溃后值可能回退(可能产生重复值);logged sequence 持久但略慢。临时表上的 sequence 默认 unlogged。这提供了序列性能与持久性的选择。
PostgreSQL 15 的逻辑订阅支持序列变更复制吗?
支持。PG15 起逻辑复制支持订阅序列(sequence)变更,即 sequence 的 nextval 推进可以被复制到订阅端,保持发布端和订阅端的序列值一致。此前序列不参与逻辑复制,主备切换或双向复制时序列值会漂移。PG19 又支持发布端 FOR ALL SEQUENCES 和订阅端 REFRESH SEQUENCES,序列同步更完整,为基于逻辑复制的大版本升级铺路。
PostgreSQL 16 的 COPY into foreign table 加速(batch insert mode)是什么?
PG16 预览支持 COPY 写入外部表(如 postgres_fdw)时的批量插入模式(batch insert),把逐行 insert 合并为批量传输,减少网络往返次数和远端开销,大幅提升 COPY 到外部表的速度。此前 COPY 外部表逐行走 FDW insert 路径,性能较差,批量模式是 FDW 写入性能的关键优化。
PostgreSQL 16 的 array_shuffle() 和 array_sample() 是做什么的?
array_shuffle() 随机打散数组元素顺序,array_sample(array, n) 从数组随机抽取 n 个元素(不重复)。它们是 PG16 引入的数组随机操作函数,替代手工用 ORDER BY random() 对数组元素排序的繁琐写法,用于随机抽奖、随机采样、洗牌等场景,简洁高效。
PostgreSQL 16 的 load_balance_hosts 是什么?
libpq 的 load_balance_hosts 参数(PG16)在配置多个 host 时,按随机顺序尝试连接,实现简单的客户端负载均衡。此前多 host 是按顺序 failover,总是优先连第一个 host。load_balance_hosts 把连接请求随机分散到各 host,配合 target_session_attrs 实现读写分离的负载均衡,避免单点连接压力过大。
PostgreSQL 16 的 pg_buffercache_usage_counts 是什么?
pg_buffercache 插件在 PG16 增强,新增 pg_buffercache_usage_counts 视图统计各 usage count(buffer 的访问热度计数)分布。usage count 反映 buffer 被访问的频率,是 buffer 淘汰策略(时钟扫描)的依据。通过该视图可了解 buffer pool 的热度分布,判断哪些页常驻内存、哪些即将被淘汰,辅助评估 shared_buffers 大小是否合适。
PostgreSQL 16 的 pg_dissect_walfile_name() 函数是什么?
pg_dissect_walfile_name(wal文件名) 解析 WAL 文件名,返回该 WAL 是第几个 WAL segment 以及 timeline 是多少。WAL 文件名编码了时间线(timeline)、日志段号、段大小等信息,此前需手工解析。该函数让 WAL 文件名的解析标准化,便于备份恢复、归档管理和位点计算时编程处理。
PostgreSQL 16 的 pg_hba.conf 通配符/正则是什么?
PG16 预览支持 pg_hba.conf 中 user、database 字段使用通配符和正则表达式,例如匹配所有以 app_ 开头的数据库或用户组。此前这些字段只支持精确名、all 或逗号列表,无法按模式匹配。这让访问控制规则更灵活,便于按命名规范批量授权,减少规则条数。
PostgreSQL 16 的 pg_stat_io 视图增强(hits、IO timing)是什么?
PG16 增强 pg_stat_io:增加 shared buffer hits 统计(缓冲命中次数),以及 reads、writes、extends、fsyncs 的 I/O 耗时(IO timing)。这让 DBA 能同时看到 I/O 的次数和耗时,区分“命中高但慢”与“命中低但快”,更准确评估存储性能和 buffer 效率,是 I/O 诊断的核心视图。
PostgreSQL 16 的 prepared statement 的 custom_plans/generic_plans 统计是什么?
PG14 起能统计 prepared statement 的 custom_plans 和 generic_plans 次数,即每次重新规划(custom)还是复用通用计划(generic)的次数。通过 pg_prepared_statements 等视图可看到某条 prepared statement 的计划使用模式。这帮助判断绑定变量是否在高效复用计划,还是因数据倾斜频繁重新规划,是计划缓存调优的依据。
PostgreSQL 16 的 psql 扩展查询协议命令是什么?
PG16 的 psql 新增命令支持使用扩展查询协议(extended query protocol),即显式使用 prepared statement 的 parse/bind/execute 流程,PG18 又增强了 psql 对 bind、parse、bindx、close 等 prepared statement 元语的支持。这让脚本化测试能精确模拟驱动层的绑定变量行为,便于调试参数化查询和执行计划。
PostgreSQL 16 的 scram_iterations 参数是什么?
scram_iterations 控制 SCRAM-SHA-256 认证中密码哈希迭代次数(默认 4096),PG16 起可配置。增大迭代次数提升暴力破解难度(密码破解成本随迭代次数线性增长),代价是登录时认证计算更慢。它是密码安全与登录性能之间的权衡,配合更严格的密码策略可增强账户安全。
PostgreSQL 16 的 string_agg / array_agg 支持并行有什么意义?
PG16 之前 string_agg、array_agg 等有序聚合不支持并行执行,是并行聚合的短板。PG16 起支持并行,让这类聚合也能利用多 worker 并行计算再合并,在大数据量聚合场景下显著提速。实现上需要处理并行聚合的合并顺序,保证 string_agg 的结果顺序符合 ORDER BY 要求。这补齐了并行聚合对有序聚合函数的覆盖。
PostgreSQL 17 的 –copy-file-range 选项(pg_upgrade)是什么?
pg_upgrade 新增 –copy-file-range 选项,升级时用 copy_file_range 系统调用复制数据文件,利用文件系统的 reflink/COW 能力,大文件复制更快、更省空间。相比传统逐块拷贝,copy_file_range 在内核态完成,减少用户态拷贝开销,是升级提速的优化。
PostgreSQL 17 的 ALTER SYSTEM 可设置未识别的自定义 GUC 是什么?
PG17 起 ALTER SYSTEM 允许设置未识别的自定义 GUC(扩展自定义参数),此前 ALTER SYSTEM 只接受内核已知参数,扩展参数需另想办法持久化。支持后,可通过 ALTER SYSTEM SET 持久化扩展参数到 postgresql.auto.conf,与内核参数统一管理。配合 allow_alter_system GUC 可控制是否允许 ALTER SYSTEM 修改配置。
PostgreSQL 17 的 ALTER TABLE SET ACCESS METHOD 支持 DEFAULT 是什么?
PG17 的 ALTER TABLE … SET ACCESS METHOD 支持 DEFAULT 选项,把表重置为默认访问方法(heap)。此前设置访问方法需显式指定,DEFAULT 让重置更直观。这配合可插拔存储引擎(table AM)使用,方便在不同 AM 间切换(如 heap 与压缩/列存 AM)。
PostgreSQL 17 的 COPY LOG_VERBOSITY 是什么?
PG17 的 COPY 支持 LOG_VERBOSITY 选项,控制错误/跳过行时打印的信息详细程度(verbose/notice/error 等),配合 SAVE_ERROR_TO 使用。PG18 又支持 silent,对跳过的错误行保持静默。这让 COPY 导入的错误输出可控,批量导入大量脏数据时不刷屏,只记录需要的错误信息。
PostgreSQL 17 的 COPY SAVE_ERROR_TO 是什么?解决什么问题?
COPY FROM 新增 SAVE_ERROR_TO 选项,导入遇到错误行时不再整体失败,而是把出错的数据保存到指定表(需提前建好)并继续导入其余行。这解决了 PG 长期被吐槽的「COPY 遇到一条坏数据就全盘报错、无法跳过错误行」的痛点。配合 LOG_VERBOSITY 可控制是否打印错误详情,PG18 又支持 LOG_VERBOSITY=silent 对跳过错误保持静默。适用于清洗不干净的外部数据批量入库。
PostgreSQL 17 的 RETURNING 支持 MERGE 是什么?
PG17 的 MERGE 语句支持 RETURNING 子句,返回被 UPDATE/INSERT/DELETE 处理的行。这让 MERGE 也能像普通 DML 一样输出变更结果,配合 CTE 或应用获取影响的行。此前 MERGE 不支持 RETURNING,需额外查询确认结果,新特性补齐了 MERGE 的结果回传能力。
PostgreSQL 17 的 SQL/JSON 函数和 jsonpath 方法增强了什么?
PG17 实现了更多 jsonpath 方法(Implement various jsonpath methods),如 .type()、.size()、.double()、.ceiling()、.floor()、.abs() 等,让 jsonpath 表达更丰富。配合 SQL/JSON 函数(JSON_EXISTS/QUERY/VALUE)和 JSON_TABLE,PG 的 JSON 查询能力向 SQL/JSON 标准全面靠拢,减少与 Oracle/标准 SQL 的差异。
PostgreSQL 17 的 alter table 部分属性 hook 是什么?
PG17 增加 ALTER TABLE 部分属性的 hook 接口,允许扩展在表结构变更(如改特定属性)时插入自定义逻辑,用于定制化审计。hook 是 PG 的扩展机制,在核心流程的特定点调用扩展回调。ALTER TABLE hook 让表结构变更可被追踪、审计、拦截,是安全审计和合规场景的扩展点。
PostgreSQL 17 的 backtrace_on_internal_error 是什么?
backtrace_on_internal_error 是 PG17 新增 GUC,在发生 XX000 内部错误时自动打印 backtrace(调用栈),帮助定位内核 bug 的触发路径。此前内部错误只有错误码和消息,无调用栈,提交 bug 报告时信息不足。开启后能捕获崩溃/内部错误的调用栈,是内核调试和问题反馈的重要辅助。
PostgreSQL 17 的 builtin collation provider 是什么?
PG17 新增 builtin collation provider,提供一种内置的、不依赖 libc 也不依赖 ICU 的排序规则。它解决了 ICU 库版本变化导致排序不稳定、以及不同环境下排序结果不一致的问题。builtin provider 提供稳定、可迁移的排序行为,适合对排序确定性要求高的场景(如索引一致性、跨环境迁移)。
PostgreSQL 17 的 event_triggers GUC 是什么?
event_triggers 是 PG17 新增的 GUC,可临时禁用事件触发器(set event_triggers = off),用于在需要绕过 DDL 事件触发逻辑的维护操作中。事件触发器会在 DDL 时执行自定义逻辑,有时会干扰批量 DDL 或迁移;临时关闭可避免干扰,完成后重新开启。这提供了对事件触发器的运行时控制。
PostgreSQL 17 的 identity columns in partitioned tables 与 serial 的区别?
identity column(GENERATED ALWAYS AS IDENTITY)是 SQL 标准的自增列,用 sequence 实现但语义更规范、不能轻易被显式插入覆盖(BY DEFAULT 除外);serial 是 PG 传统的语法糖,等价于 int + sequence + default nextval,历史包袱较重。PG17 让 identity 列可用于分区表。推荐新表用 identity 替代 serial,符合标准且更安全。
PostgreSQL 17 的 pg_basetype 函数是什么?
pg_basetype(oid) 用于获取 domain 类型的基本类型,例如一个 email domain 基于 text,pg_basetype 返回 text 的 OID。domain 是带约束的别名类型,很多操作需要知道其底层基类型。PG17 提供该函数简化了 domain 到基类型的解析,方便在元数据处理、类型兼容判断时使用。
PostgreSQL 17 的 pg_basetype 和 domain 类型系统什么关系?
domain 是带约束的别名类型,底层有基类型(basetype)。pg_basetype 函数返回 domain 的基类型 OID,用于类型系统里从 domain 解析到真正的存储类型。这在元数据处理、类型兼容判断、动态 SQL 生成时有用——需要知道 domain 底层是什么类型才能做正确操作。
PostgreSQL 17 的 pg_input_is_valid 和 pg_input_error_info 是什么?
PG17 预览新增 pg_input_is_valid(text, type) 检测字符串能否自动转换为目标类型,pg_input_error_info 返回转换失败的具体错误信息。这替代了手工 try-cast 或正则预校验,用于数据清洗、导入前预检、动态类型判断等场景,让“这个值能不能转成 date/int”的判断变得简单可靠。
PostgreSQL 17 的 pg_replication_slots.conflict_reason 是什么?
PG17 的主库 pg_replication_slots 视图新增 conflict_reason 字段,跟踪逻辑复制冲突原因(如 update/delete 冲突、行不存在等)。当逻辑复制订阅端报冲突时,发布端能记录冲突类型,帮助定位数据不一致的来源。这增强了逻辑复制的冲突诊断能力,配合订阅端冲突检测使用。
PostgreSQL 17 的 plpgsql 支持 %TYPE %ROWTYPE 数组变量,如何用?
PG17 起 plpgsql 可声明与列类型绑定的数组变量,例如 DECLARE v_arr mytable.col%TYPE[]; 或 v_rows mytable%ROWTYPE[];。这样数组元素类型随表结构自动变化,无需硬编码类型名。它让函数处理表数据时更健壮,表结构变更(改列类型)后函数无需改动。
PostgreSQL 17 的 table AM 增强与 undo-based AM 有什么关系?
PG17 频繁提交 table access method 相关 patch,包括自定义 reloptions、SET ACCESS METHOD 支持 DEFAULT 等,说明 undo-based table access methods(如 zheap)在持续推进。undo-based AM 用 undo 日志替代 vacuum 清理死版本,是 PG 摆脱 vacuum 膨胀问题的长期方向。这些 patch 为未来 undo AM 落地铺路。
PostgreSQL 17 的 table AM 自定义 reloptions 是什么?
PG17 增强 table access method(表访问方法)框架,支持自定义 reloptions(表级选项),让自定义存储引擎能定义自己的表参数。table AM 是 PG 可插拔存储引擎的接口(如 heap、zheap 尝试的 undo-based AM)。自定义 reloptions 让新 AM 有更完整的配置能力,是存储引擎可插拔化的一步。
PostgreSQL 17 的 transaction_timeout 参数是做什么的?
transaction_timeout 用于限制单个事务的最长持续时间,超过设定值(如 10s)事务会被自动中止,防止长事务长期占用资源、阻塞 vacuum、拖慢快照清理。它与 statement_timeout(单条语句)、idle_in_transaction_session_timeout(事务内空闲)互补,分别针对事务总时长、语句时长和空闲等待。PG17 引入,适合为失控的长事务兜底,避免业务 bug 造成连接和锁堆积。
PostgreSQL 17 的 uuid 相关函数增强了什么?
PG17 增强 UUID 功能:支持提取 UUID 值内的时间戳(解析 UUID v1 的时间位),以及生成指定版本(v1/v4 等)的 UUID 函数。这方便在 UUID 上做时间范围分析、判断 UUID 版本。配合 pg_idkit 插件可获得各种 UUID 生成方法(UUIDv4/v7、ULID、NanoID 等)的大集合。
PostgreSQL 17 的自定义等待事件是什么?
PG17 支持自定义等待事件,允许扩展定义自己的 wait event 名称和含义,纳入 pg_stat_activity 的 wait_event 体系。此前等待事件由内核固定定义,扩展无法新增。支持后,扩展的阻塞点能被监控工具识别,提升可观测性。配合 pg_wait_events 视图可查看所有等待事件的定义。
PostgreSQL 18 的 CREATE FOREIGN TABLE 支持 LIKE 语法是什么?
PG18 的 CREATE FOREIGN TABLE 支持 LIKE 语法,可以基于已有表(含外部表)的结构创建新的外部表,继承列定义。此前 LIKE 只支持普通表,外部表需手工罗列列。支持后,创建结构相同的外部表更便捷,尤其做 FDW 分片、多外部表对齐结构时。
PostgreSQL 18 的 NUMA 感知和 AIO 是配套的存储演进吗?
两者都是 PG18 向现代硬件架构演进的组成部分:AIO/io_uring 解决 I/O 阻塞(异步 I/O),NUMA 感知解决多路服务器跨节点内存访问延迟。它们共同目标是让 PG 更好地利用 NVMe、多路 CPU、大内存等现代硬件,提升高并发和大数据量下的吞吐。PG19 继续推进 AIO worker 池调优和 io_uring 优化,是持续演进的方向。
PostgreSQL 18 的 NUMA 感知能力是什么?
PG18 预览引入 NUMA(非一致性内存访问)感知能力,让 PG 能识别 CPU 与内存节点的拓扑,把相关内存分配和进程调度贴近所在 NUMA 节点,减少跨节点内存访问延迟。在多路服务器上,跨 NUMA 访问内存明显更慢,NUMA 感知能提升大规模并行和大内存场景的性能,是 PG 向现代硬件架构适配的一步。
PostgreSQL 18 的 NUMERIC scale 支持 -1000 到 1000 是什么意思?
PG15 起 NUMERIC(precision, scale) 的 scale 支持范围扩大到 -1000 到 1000(此前 scale 不能为负)。scale 为负数时表示小数点左侧舍入,如 scale=-2 表示精确到百位。这增强了对大数、货币精度、科学计数等场景的表达能力,让 NUMERIC 的精度控制更灵活。
PostgreSQL 18 的 OAuth 认证与 OAuth HBA 选项是什么?
PG18 支持 OAuth 2.0 认证,PG19 又增强 OAuth 认证,细化 HBA 级别的选项配置和调试机制。HBA 里可配置 OAuth 的 IdP、client、scope 等选项,控制 OAuth 认证的细节,并提供调试信息输出。这让 OAuth 认证可精细配置、可排障,满足企业 SSO 集成的合规和运维需求。
PostgreSQL 18 的 OID 64 位与 pg_upgrade 的关系?
OID 升级到 64 位是 PG 底层对象标识的重大变更,涉及系统表和 catalog 结构,pg_upgrade 跨版本升级时需处理 OID 宽度变化。这是 PG 长期演进的一部分,与“高 churn 场景 OID 耗尽”的痛点相关。用户需关注升级路径和相关工具的兼容性。
PostgreSQL 18 的 OLD/NEW RETURNING 支持什么?
PG18 预览在 DML 的 RETURNING 子句中支持 OLD 和 NEW 别名,可以在 UPDATE/DELETE 时同时返回更新前(OLD)和更新后(NEW)的值,例如 UPDATE t SET x=x+1 RETURNING OLD.x, NEW.x。此前 RETURNING 只能访问新值,无法拿到旧值,需借助触发器或额外的 UPDATE…RETURNING 绕道。这对审计、变更数据捕获(CDC)和乐观锁校验很有用。
PostgreSQL 18 的 SIMD 提升 JSON 字符串转义性能是什么?
PG18 预览用 SIMD(单指令多数据)指令优化 JSON 字符串转义/反转义,利用 CPU 向量指令一次处理多个字符,批量检测需转义的字符,替代逐字符扫描。这对 JSON 序列化/解析这类字符密集操作有明显加速,降低 CPU 开销,是 PG 利用现代 CPU 指令集的优化之一。
PostgreSQL 18 的 WITHOUT OVERLAPS 唯一约束和 PERIOD 外键约束是什么?
WITHOUT OVERLAPS 让 PRIMARY KEY 或 UNIQUE 约束对 range 类型表达“值不相交”,例如唯一约束 (room_id, during WITHOUT OVERLAPS) 表示同一房间的时间范围不允许重叠,替代了传统用 exclude 约束的写法。PERIOD 外键约束则要求外键的时间范围必须被主键已有值的范围覆盖。这两个是 SQL:2023 时态约束特性,PG18 正式引入,把时态数据的完整性约束从手工 exclude 语法升级为标准语法。
PostgreSQL 18 的 array_sort 函数是什么?
array_sort 是 PG18 预览新增的数组排序函数,对数组元素按默认排序规则排序返回,替代此前需 unnest 展开再排序再聚合的繁琐写法。它支持对整数、文本等类型数组排序,让数组内排序一行搞定,提升可读性和性能。
PostgreSQL 18 的 async IO 与 effective_io_concurrency 的关系?
effective_io_concurrency 是同步预取(prefetch)的并发度参数,位图扫描时提前发多个 I/O 请求;而 async IO(io_uring)是真正的异步 I/O 框架,进程发出 I/O 后不阻塞等待。两者目标都是提升 I/O 并行性,但机制不同:预取是“提前读”,异步 I/O 是“非阻塞提交”。PG18 提高 effective_io_concurrency 默认值到 16 与 AIO 框架引入并行推进。
PostgreSQL 18 的 check/foreign key 约束 NOT ENFORCED 是什么?
PG18 预览支持为 check 和 foreign key 约束引入 NOT ENFORCED(假设为真、不强制校验)选项,即声明约束但不实际执行检查。这主要用于数据仓库或已清洗数据的场景:约束仅作为元数据/查询优化提示存在,减少写入时校验开销。它借鉴了其他数据库(如 Snowflake、Postgres 分支)的做法,社区对此有“妥协”讨论,因为不强制校验意味着约束可能被违反,只适合可信数据源。
PostgreSQL 18 的 copy 物化视图 to 是什么?
PG18 预览支持 COPY (SELECT … FROM 物化视图) TO 或直接 copy 物化视图导出,把物化视图内容作为 COPY 数据源。此前 COPY 只能作用于表或查询,物化视图需额外 SELECT。该特性让物化视图的导出(备份、交换、离线分析)更直接。
PostgreSQL 18 的 effective_io_concurrency 默认值调整意味着什么?
PG18 预览把 effective_io_concurrency 和 maintenance_io_concurrency 默认值从 1 提高到 16,适配现代 SSD/NVMe 的高并发 I/O 能力。effective_io_concurrency 控制位图堆扫描时预取的并发 I/O 数,maintenance_io_concurrency 控制维护操作(如 vacuum、analyze)的预取。默认值提高让新装库在 SSD 上自动获得更好的 I/O 并行性,但机械盘环境可能需调回较低值。
PostgreSQL 18 的 explain 增强 window 函数输出是什么?
PG18 预览增强 EXPLAIN,在窗口函数节点输出更详细的信息(如窗口规格、排序、帧等),让 DBA 能看到窗口计算的执行细节,辅助分析窗口查询的性能瓶颈(如是否额外排序、帧范围多大)。这对优化复杂分析查询(大量窗口函数)很有价值。
PostgreSQL 18 的 file_copy_method(COPY/CLONE)是什么?
PG18 预览新增 file_copy_method 参数,支持 COPY(传统拷贝)和 CLONE(写时复制 COW)两种文件复制方式。CLONE 利用文件系统的 reflink(如 XFS/Btrfs 支持),复制文件时不真正拷贝数据块,只在修改时才复制,大幅加速大文件复制(如备份、建库、表空间拷贝),节省磁盘空间和 I/O。
PostgreSQL 18 的 gamma() 和 lgamma() 函数是什么?
gamma(x) 返回伽马函数值,lgamma(x) 返回伽马函数绝对值的自然对数,是 PG18 预览新增的数学函数。它们补齐了 PG 在特殊函数(gamma 函数是阶乘在实数域的推广)方面的不足,服务于统计分析、科学计算、概率建模等场景。
PostgreSQL 18 的 int 和 bytea 互转是什么?
PG18 预览支持 int 与 bytea 互相转换,例如把整数编码为字节串或从字节串解码出整数,用于二进制数据处理、协议解析、序列化等场景。此前这类转换需要手工写位运算或借助第三方函数。内置转换让 PG 在数据序列化/反序列化、与外部二进制系统对接时更方便。
PostgreSQL 18 的 log_connections 模块化是什么?
PG18 预览增强 log_connections,精细记录用户连接的各个阶段信息(如连接建立、认证开始/成功/失败、SSL 协商等),模块化输出便于判断连接卡在哪一步。此前 log_connections 只打印连接建立和断开,认证细节要另看日志。模块化后,定位连接慢、认证失败、SSL 握手问题更直观。
PostgreSQL 18 的 max_files_per_process 更新与 io_uring 什么关系?
PG18 更新 max_files_per_process 的默认值和逻辑,为异步 IO(io_uring)做准备。io_uring 用固定数量的 ring 提交队列,替代大量打开的文件描述符,减少 fd 占用和系统调用。因此 max_files_per_process 的默认值调整,配合 AIO 框架,让 PG 更高效管理文件。这是 AIO 落地的前置准备工作。
PostgreSQL 18 的 min/max_protocol_version 连接协议控制是什么?
PG18 预览新增 min_protocol_version / max_protocol_version,控制允许连接的前后端协议版本范围,提升协议兼容性和安全性。类似 SSL 的 min/max_protocol_version,用于限制连接只能使用指定协议版本,防止过旧或过新的客户端协议接入,便于平滑升级和兼容性管理。
PostgreSQL 18 的 pg_buffercache_evict 函数是什么?
PG18 预览 pg_buffercache 插件新增 pg_buffercache_evict_relation / pg_buffercache_evict_all 函数,用于主动驱逐 shared buffer 中未 pin 的页(把指定表或所有可驱逐页清出 buffer)。这用于测试 buffer 淘汰、冷热分离、模拟缓存失效等场景,让 DBA 能精确控制 buffer 内容,验证查询在“无缓存”下的真实性能。
PostgreSQL 18 的 pg_combinebackup 硬链接支持是什么?
pg_combinebackup 用于合并全量+增量备份,PG18 预览支持硬链接(hard link)选项,合并时对未变化的文件用硬链接而非复制,节省空间和时间。这优化了增量备份合并的效率,尤其当多个增量备份共享大量未变数据块时,避免重复拷贝。
PostgreSQL 18 的 pg_createsubscriber –all 选项是什么?
pg_createsubscriber 用于把物理 standby 转为逻辑订阅者,PG18 预览新增 –all 选项,方便对全实例所有数据库做逻辑订阅,而非逐库指定。这简化了“物理从库平滑切换为逻辑订阅者”的批量操作,配合大版本升级和零停机迁移流程,让全库逻辑复制初始化更省事。
PostgreSQL 18 的 pg_get_acl() 支持 sub-OID(列级权限)是什么?
pg_get_acl() 用于获取对象的 ACL(访问控制列表),PG18 预览支持 sub-OID,能检测列级别的权限。此前 ACL 查询主要针对表级对象,列级权限(GRANT … ON COLUMN)难以通过 pg_get_acl 获取。支持 sub-OID 后,列级权限的审计和查询更完整,补齐了细粒度权限的可观测性。
PostgreSQL 18 的 pg_stat_activity 新增 authenticating 状态是什么?
PG18 预览 pg_stat_activity 新增 authenticating 状态,表示会话正在认证过程中,用于检测拒绝服务(DDoS)攻击——大量连接卡在认证阶段说明可能被暴力认证/连接耗尽攻击。此前认证中的连接状态不清晰,难以区分正常连接和恶意连接,新状态让认证阶段的会话可观测、可告警。
PostgreSQL 18 的 pg_stat_get_backend_io() 函数是什么?
pg_stat_get_backend_io(pid) 是 PG18 预览新增函数,返回指定后端进程的 I/O 统计(读写、扩展、fsync 等次数和时间),把原来只能全局看(pg_stat_io)的 I/O 指标细化到单个会话/进程。这让 DBA 能定位是哪个会话在疯狂读写磁盘,是 I/O 问题排障的有力工具。
PostgreSQL 18 的 psql pipeline 流水线模式是什么?
PG18 的 psql 支持 pipeline 流水线模式,允许客户端在一个连接上连续发送多条命令而无需等待每条返回(类似 libpq pipeline mode),减少往返延迟。这对需要连续执行大量独立命令的脚本(如批量建表、批量插入)有显著提速,此前每条命令都要等上一条完成。
PostgreSQL 18 的 range 类型 GiST/B-tree sortsupport 是什么?
PG18 预览为 range 类型增加 GiST 和 B-tree 的 sortsupport 接口,加速 range 值的比较和排序。sortsupport 用更快的底层比较函数替代通用的 SQL 函数调用比较,显著提升 range 列的排序、聚合、索引构建性能。这是 range 类型性能优化的一环。
PostgreSQL 18 的 reverse(bytea) 字节流反序函数是什么?
PG18 预览支持 reverse(bytea),对字节串做字节顺序反转,是大端/小端字节序转换的便捷工具。此前 reverse 只支持 text,bytea 需要手工处理。它在二进制协议处理、哈希值存储、字节序调整等场景有用,补全了 bytea 的字符串类操作。
PostgreSQL 18 的异步 I/O(AIO / io_uring)框架是什么?
PG18 重磅引入异步 I/O 框架,为基于 io_uring 的异步 I/O 打基础,配套更新 max_files_per_process、改进 buffer manager API。异步 I/O 让 I/O 请求不阻塞后端进程,进程发起读写后可继续执行,完成后回调处理,减少 I/O 等待、提升高并发吞吐。这是 PG 存储引擎现代化的重大演进,PG19 继续做了 AIO worker 池自动调优和 io_uring 内存映射合并。
PostgreSQL 18 的虚拟生成列(virtual generated column)是什么?
PG18 预览支持 virtual generated column,即生成列不物理存储,每次读取时实时计算。相比 stored(写时计算并存储),virtual 省空间,但查询时每次都要计算,且一般不能建索引。virtual 列适合“派生值占用大但很少查询”或“基列频繁更新、不希望冗余存储”的场景,与 stored 形成互补。
PostgreSQL 19 的 COPY FROM CSV 吃上 SIMD 红利是什么?
PG19 预览让 COPY FROM CSV 数据导入利用 SIMD 指令加速,把 CSV 解析(分隔符识别、转义处理、字段切分)向量化,一次处理多个字节,显著提升批量导入吞吐。CSV 解析是导入的瓶颈之一,SIMD 化让 COPY 导入速度进一步提升,对数据仓库和 ETL 场景是直接的性能红利。
PostgreSQL 19 的 COPY FROM 多行表头是什么?
PG19 预览支持 COPY FROM 命令的多行表头,即 CSV 文件前 N 行都可以作为表头(元信息),而不仅是第一行。这适用于一些导出工具生成的多行表头文件(如带注释、带列分组的多行头)。此前 HEADER 只认一行,多行头需要手工剥离,新特性让 COPY 能直接跳过指定数量的表头行。
PostgreSQL 19 的 JSON 变成“数据出口”标准是什么意思?
PG19 预览增强 JSON 的输出能力,从“存储 JSON”进化到“交付 JSON”,让 JSON 成为数据出口的标准格式。例如增强 JSON 构造器、JSON_TABLE、jsonpath,使关系数据能方便地转换为 JSON 输出(API 场景),JSON 数据也能结构化查询。这让 PG 直接服务 API 层,减少应用层的数据格式转换。
PostgreSQL 19 的 SQL/PGQ 是什么?
SQL/PGQ 是 SQL 标准中属性图查询(Property Graph Query)的语法,PG19 将其并入主干代码,让关系数据库原生支持图查询(MATCH 模式匹配图遍历),图 SQL 回归关系数据库主航道。此前图查询多靠第三方插件(AGE、DuckPGQ)。SQL/PGQ 的引入意味着 PG 无需扩展就能用标准 SQL 语法表达节点、边、路径和模式匹配,是 PG 多模能力(关系+图)的重要里程碑。
PostgreSQL 19 的 injection_points_list() 函数是什么?
injection_points 是 PG 的代码注入测试框架,用于在指定代码点注入行为(如触发错误、模拟故障)。PG19 预览新增 injection_points_list() 函数列出所有可用的注入点,方便测试人员发现和使用注入点。它服务于内核测试和故障注入(fault injection),让开发者能针对特定代码路径做测试。
PostgreSQL 19 的 pg_dsm_registry_allocations 视图是什么?
PG19 预览新增 pg_dsm_registry_allocations 视图,暴露动态共享内存(DSM)注册表的分配情况,便于观察哪些 DSM 段被谁分配、大小如何。DSM 是并行查询、共享内存扩展(如 pg_stat_statements、动态共享内存)的基础。该视图提升了共享内存子系统的可观测性,辅助定位 DSM 泄漏和内存规划。
PostgreSQL 19 的 pg_stash_advice 与 hint 有什么关系?
pg_stash_advice 本质是 PG 社区对“执行计划提示”需求的官方化回应,让 DBA 能对优化器施加建议(类似其他数据库的 hint),固定或引导执行计划。PG 长期靠 GUC、统计信息和改写 SQL 间接影响计划,缺乏直接的 hint 机制。pg_stash_advice 提供了一种可控的计划建议手段,用于优化器估错时的应急和稳定性保障,同时避免传统 hint 的硬编码危害。
PostgreSQL 19 的 pg_stash_advice 和 wait for LSN 分别解决什么?
pg_stash_advice 解决优化器估错时的计划干预(给计划戴紧箍咒,类似 hint);WAIT FOR LSN 解决读写分离的一致性读(等待 LSN 回放)。两者都是 PG19 的重要新特性:前者面向查询优化,后者面向高可用读一致性。都体现了 PG 在“可控性”和“一致性”上的增强。
PostgreSQL 19 的 pg_stash_advice 是什么?
pg_stash_advice 是 PG19 预览的特性,为查询计划“戴上紧箍咒”,让 DBA 可以给优化器施加建议/提示,影响执行计划的选择(类似 hint 机制)。它提供了一种受控的优化器干预手段,用于在优化器估错、统计信息不足或特殊场景下固定执行计划,避免频繁更改统计信息或改写 SQL。
PostgreSQL 19 的 pg_stat_progress_basebackup 新增 backup_type 字段是什么?
PG19 预览在 pg_stat_progress_basebackup 视图新增 backup_type 字段,区分备份类型(全量备份、增量备份等)。这让 DBA 在观察备份进度时能明确当前是哪种备份,配合 PG17 引入的增量备份能力,更好监控不同备份方式的进度和状态。
PostgreSQL 19 的 regdatabase OID 别名是什么?
PG19 预览新增 regdatabase 类型,作为数据库 OID 的别名,类似 regclass、regtype,可直接用数据库名代替 OID 书写,例如 ‘dbname’::regdatabase 解析为数据库 OID。这让数据库 OID 的表示更友好、可读,与已有的 regclass(表)、regnamespace(模式)等 reg* 类型家族一致。
PostgreSQL 的 CASEFOLD() 函数是什么,比 LOWER() 强在哪?
CASEFOLD() 是 PG18 预览的增强版 LOWER(),用于大小写不敏感转换,对多字节字符(如中文、Unicode 扩展字符)支持更好,遵循 Unicode 大小写折叠规则(case folding),能处理 LOWER() 覆盖不到的字符。它适合需要严格大小写不敏感比较、检索和排序的国际文本场景,尤其是多语言内容。
PostgreSQL 的 COPY 支持 binary 格式吗?
支持。COPY … WITH (FORMAT binary) 使用二进制格式,直接以类型内部表示传输,比 text/csv 更快、更紧凑,且无精度损失(text 格式的浮点数可能有舍入)。缺点是 binary 格式与 PG 版本和类型实现绑定,跨版本或异构系统不通用,且文件不可读。适合 PG 到 PG 的高性能数据迁移、备份导出。
PostgreSQL 的 DataSketches 近似算法库是什么?
DataSketches 是近似算法库(源自 Apache),提供 HLL、分位数 sketch、频繁项等近似数据结构,用极小内存估算大数据集指标。PG 集成后,可做近似 distinct、近似分位数、top-k 等,适合海量数据的实时分析(如实时 UV、P99 延迟),在误差可接受范围内大幅节省内存和计算。
PostgreSQL 的 Generated Column(生成列)是什么?分哪两种?
生成列(Generated column)是由表达式计算得到的虚拟列,PG12 起支持 stored 类型,即在写时计算并物理存储,例如 c int GENERATED ALWAYS AS (a+b) STORED。PG18 又预览了 virtual 类型(读时实时计算、不占存储)。生成列的值由数据库自动维护,不能直接 INSERT/UPDATE 写入。stored 生成列可用于索引,适合物化派生值;virtual 生成列省空间但每次读取都需计算。
PostgreSQL 的 HLL(HyperLogLog)近似计算插件是什么?
HLL 是基数估计算法(HyperLogLog),用很小的固定内存估算去重后元素个数(UV、distinct count),误差约 1% 量级。postgresql-hll 扩展提供 hll 类型,支持 hll_add 累加、hll_union 合并、hll_cardinality 求基数。它解决海量数据精确 distinct count 内存占用大、计算慢的问题,适合 UV 统计、留存分析、实时去重等允许近似误差的场景。多个 HLL 可 union 合并,支持跨天/跨分区聚合。
PostgreSQL 的 Hypothetical-Set Aggregate Functions(假设聚合)是什么?
假设聚合(如 rank、dense_rank、percent_rank、cume_dist 的 WITHIN GROUP 形式)用于计算“如果某值加入数据集,它会排第几”的假设性问题,例如 SELECT rank(90) WITHIN GROUP (ORDER BY score) FROM t 返回 90 分在现有成绩中的排名。它们不聚合实际数据,而是回答假设排序问题,常用于分位数、排名分析。
PostgreSQL 的 JOIN … USING 别名(F404 Range variable)是什么?
PG14 支持 SQL:2016 特性 F404,允许给 JOIN … USING 附加别名(AS),用于引用 USING 公共列名。此前 JOIN USING 产生的公共列无法通过别名限定引用。该特性让 USING 连接的公共列在复杂查询中能被明确引用,消除歧义,是 SQL 标准兼容性增强。
PostgreSQL 的 LIKE ‘%xxx%’ 模糊查询如何加速?
模糊查询 like ‘%xxx%’(前后都有通配符)无法用普通 B-tree 索引,可用 pg_trgm(三字图)或 pg_bigm(双字图)插件建 GIN 索引加速。pg_trgm 对 3 个字符以上的模式效果好,pg_bigm 支持 2-gram,对中文和短词更优。此外全文检索(tsvector + GIN)适合分词场景,倒排索引插件(如 pgroonga)支持更复杂的模糊和 JSON 模糊查询。选择取决于数据是“子串匹配”还是“分词匹配”。
PostgreSQL 的 MobilityDB(移动对象)数据库是什么?
MobilityDB 是移动对象数据库扩展,在 PostGIS 基础上增加移动对象(轨迹)类型,支持时空查询(某时刻某对象的位置、轨迹相交、速度计算等)。它把时间维度融入空间类型,适合 GPS 轨迹、车辆船舶、物流追踪等移动数据场景。可配合 citus 大规模处理百亿级轨迹。
PostgreSQL 的 anon(Anonymizer)脱敏插件是什么?
anon 是数据脱敏(Anonymizer)扩展,基于 security label provider,对敏感字段(姓名、身份证、手机号)做匿名化/假名化处理,用于测试环境数据脱敏、满足隐私合规(GDPR、个保法)。它支持多种脱敏策略(随机、掩码、泛化),在数据导出或查询时动态脱敏。相比手工脱敏脚本,anon 更系统、可复用。
PostgreSQL 的 any_value 聚合函数是什么?
any_value 是 PG16 引入的聚合函数,从每个分组返回任意一行的值(不保证是哪个),适合“分组后取任意一个代表值”的场景。它比 min/max 更快(无需比较),也不会像 first_value 那样需要 ORDER BY。典型用途是“每个客户取任意一条联系方式”这类不关心具体取哪条的需求,减少排序开销。
PostgreSQL 的 anyelement/anycompatible 多态类型是什么?
anyelement、anyarray、anycompatible 是伪类型(pseudo-type),用于函数参数和返回值声明多态,让一个函数适配多种具体类型。anyelement 要求所有该类型参数实际传入的类型完全一致;anycompatible 系列则允许不同类型通过隐式转换解析出一个公共类型(common type),更宽松。多态类型让函数库(如 any_value、自定义聚合)无需为每种类型写重载,是 PG 扩展点的重要机制。
PostgreSQL 的 array 类型有哪些常用操作?
array 类型支持:下标访问(arr[1])、切片(arr[1:3])、拼接(||)、包含(@>、<@)、重叠(&&)、unnest 展开、array_agg 聚合、array_remove/array_position 等函数。数组适合存有序小集合,但查询需配合 GIN 索引(对 @>、&&)或 unnest 展开。注意数组不宜存大集合或高频更新的数据,关系模型更合适。
PostgreSQL 的 clickhousedb_fdw 和 odbc_fdw 是做什么的?
clickhousedb_fdw 让 PG 通过外部表访问 ClickHouse 数据,odbc_fdw/ogr_fdw 访问 SQL Server 等支持 ODBC 的数据源。这些是异构数据源 FDW,让 PG 作为联邦查询入口,跨库 join 和分析不同数据库的数据。选型上,有专门 FDW(如 clickhousedb_fdw、mysql_fdw)优先用专门的,否则用 ODBC 通用接口。
PostgreSQL 的 dblink 和 postgres_fdw 区别,怎么选?
dblink 是早期的跨库查询函数接口(dblink() 函数执行远端 SQL),语法灵活但无法做查询优化、无 pushdown、结果需手动处理;postgres_fdw 是标准 FDW(外部表),支持 pushdown、异步、批量插入,优化器能参与规划,性能更好。新场景优先 postgres_fdw,dblink 仅用于临时、动态远端 SQL 的场景。
PostgreSQL 的 ddlx 插件(show create)是什么?
ddlx 插件提供类似 MySQL 的 SHOW CREATE 功能,生成对象的 DDL 语句(表、视图、函数等),方便查看对象定义。它补齐了 PG 缺“show create table”的短板(虽可查 pg_get_*_ddl 或 pg_dump)。ddlx 用 SQL 函数直接返回 DDL 文本,便于脚本化获取对象定义,是对象管理和审计的实用工具。
PostgreSQL 的 diskquota 磁盘配额插件是什么?
diskquota 是磁盘配额插件,限制 schema、role、表空间等的磁盘使用上限,防止单个用户/业务写满磁盘影响他人。它在多租户共享实例里很重要,配合 cgroup 资源隔离实现完整的租户隔离(CPU/内存/磁盘)。超配额时拒绝写入并告警。
PostgreSQL 的 domain 类型如何兼容 MySQL 的 year、tinyint、unsigned?
用 domain 定义带约束的别名类型来兼容 MySQL 特殊类型:year 可定义为 int2 加范围约束;tinyint 定义为 int2;unsigned int 定义为 int4/int8 加 CHECK (值 >= 0);zerofill 可用 lpad 格式化输出模拟。domain 不改底层存储类型,只附加约束和显示格式,因此能低成本兼容 MySQL 的列定义语义,迁移时无需改底层数据。
PostgreSQL 的 email 类型如何实现?
PG 没有内置 email 类型,可用 domain 定义(CREATE DOMAIN email AS text CHECK (value ~ ‘邮箱正则’))附加格式校验;或用第三方扩展 pgemailaddr 提供专用 email 类型。domain 方案简单灵活、基于 text 存储,校验靠 CHECK 约束;扩展方案类型更专业、附带更多函数。多数场景用 domain + 正则校验即可满足。
PostgreSQL 的 file_fdw 查询日志怎么做?
file_fdw 把文件(CSV、日志)作为外部表查询。查数据库日志:log_destination 配 csvlog,日志落 csv 文件,用 file_fdw(或 log_fdw)建外部表指向日志文件,SQL 查询。PROGRAM 选项可执行外部命令(find、awk)生成数据流。这让“用 SQL 查日志”成为可能,配合过滤、聚合分析日志。
PostgreSQL 的 gdb / VS Code 调试 PG 怎么做?
调试 PG 用 gdb 附加到 backend 进程(需编译带 -g 调试符号、设置断点、跟踪执行),或用 VS Code 配置 launch.json 远程/本地调试。要点:找到对应 backend 进程 PID(pg_stat_activity 的 pid),gdb attach 后设断点(如 ExecInsert、某函数),观察变量和调用栈。配合 backtrace_functions、debug 参数定位内核问题。
PostgreSQL 的 geography 和 geometry 类型有什么区别?
geometry 在平面笛卡尔坐标系下计算,适合小范围、投影坐标;geography 在地球球面上计算(大地测量),考虑地球曲率,适合全球范围的经纬度距离和面积计算。geography 计算更准确但更慢,支持的函数少于 geometry。PostGIS 里选型取决于范围:全球/大范围用 geography,局部高精度用 geometry。
PostgreSQL 的 hll 在留存和 UV 统计中的通用用法是什么?
HLL 用于留存/UV 统计:每天对活跃用户生成一个 HLL,跨天留存用 hll_union 合并多天 HLL 后 hll_cardinality 求并集基数,即“这些天总的去重用户数”;留存用户数 = 第 1 天 HLL 与第 N 天 HLL 的交集基数(用公式 A+B-union 近似)。相比精确 count(distinct) 需存全量用户 ID,HLL 只存极小结构,适合亿级 UV 实时分析。
PostgreSQL 的 imgsmlr 图像相似搜索是什么?
imgsmlr 是图像相似搜索插件,存储图像的特征值(如颜色直方图、GIST 特征),用向量距离计算图像相似度。它配合 PG 的向量能力实现“以图搜图”。相比深度特征(pgvector + embedding),imgsmlr 用传统图像特征,轻量但精度有限,适合简单图像去重和相似检索。
PostgreSQL 的 jsonb 索引有哪两种 GIN 操作符类,怎么选?
jsonb 的 GIN 索引有两种操作符类:jsonb_ops(默认)和 jsonb_path_ops。jsonb_ops 支持 ?、?|、?&、@> 等操作符,索引条目记录每个 key 和 value,索引较大;jsonb_path_ops 只支持 @> 包含操作符,但索引更小、查询更快,因为它只记录 value 的路径哈希。如果查询主要是 @>(包含判断),优先 jsonb_path_ops;需要 ?、?| 等操作符则必须 jsonb_ops。此外还能建表达式索引对特定路径(如 jsonb_col-»‘x’)建 B-tree。
PostgreSQL 的 log_fdw 是什么?
log_fdw 是文件 FDW 的应用,把数据库日志(csvlog)作为外部表用 SQL 查询,方便在库内直接检索和分析日志内容。配合 file_fdw 读取 csv 格式日志、program 选项执行外部命令(find 等),实现“用 SQL 查询数据库日志”。这在排查问题时无需登录服务器 grep 日志,可直接 SQL 过滤、聚合。
PostgreSQL 的 ltree 存储结构是什么?
ltree 用点分隔的标签路径存储(如 a.b.c),内部用紧凑的路径表示存储,配合 GiST 索引加速祖先/后代、路径匹配查询。ltree 的标签长度和字符集有限制(PG16 扩展到 1000 字符、支持大小写/数字/下划线/连字符)。它适合层次分类、树形路径等场景,是轻量的层次数据方案。
PostgreSQL 的 ltree 类型是什么,PG16 增强了什么?
ltree 是层次路径类型,用点分隔的标签表示树形路径(如 Top.Countries.Europe.France),支持祖先/后代查询、路径匹配(lquery/ltxtquery),配合 GiST 索引加速。PG16 增强 ltree:支持大小写字母、数字、下划线、连字符,值长度增加到 1000 字符。ltree 适合分类体系、物料编码、组织架构等层次数据。
PostgreSQL 的 md5hash 插件是什么?
md5hash 插件用 128 位整数存储 MD5 哈希值,替代 text/bytea 存储 32 位十六进制字符串,压缩空间、提升比较和索引效率。MD5 值本质是 128 位,用整数存储比文本小一半以上,且整数比较更快。适合需要大量存储哈希值(如去重指纹、缓存 key)的场景。
PostgreSQL 的 parser 和 resolution 有什么区别?
parser(解析器)把 SQL 文本解析为语法树(parse tree),只做语法层面的解析,不检查语义;resolution(解析/绑定)把语法树中的名字(表名、列名、函数名)绑定到实际的数据库对象(OID),做语义分析,生成 query tree。两者是 SQL 处理流水线的两个阶段:先语法后语义,对应 PG 的 raw parser 和 analyze/rewrite 阶段。
PostgreSQL 的 pase 向量相似推荐插件是什么?
pase 是 PG 的向量相似检索插件(阿里云生态),用向量表示特征(用户画像、商品、图像),做相似度检索和推荐。它配合 smlar、pg_trgm 实现“标签+权重相似排序、标签命中率排序”的推荐系统。向量检索是推荐系统的核心技术,PG 内实现可减少数据搬运。
PostgreSQL 的 pg_backtrace 插件是什么?
pg_backtrace 是打印详细错误调用栈的插件,当数据库发生错误时输出 C 层 backtrace,帮助定位错误发生的代码路径。它类似 PG17 内置的 backtrace_on_internal_error,但作为插件可用于更早版本。对内核开发、问题定位、bug 反馈都有用。
PostgreSQL 的 pg_cgroups 资源隔离是什么?
pg_cgroups 是用户、会话、业务级的资源隔离方案,基于 Linux cgroup 把不同用户/会话/业务的进程放入不同 cgroup,限制其 CPU、内存、IO 等资源配额。这让多租户共享一个 PG 实例时,能隔离“捣蛋鬼”业务对资源的抢占,避免单一业务拖垮整个库。相比独立实例,cgroup 隔离粒度更细、资源利用率更高。
PostgreSQL 的 pg_cheat_funcs 和 pg_dba 常用函数库是什么?
这类插件打包了 DBA 日常常用的工具函数(类型转换、格式化、调试、权限查询等),省去手工创建 UDF。它们提供“开箱即用”的函数集合,提升 DBA 工作效率。属于轻量实用插件,适合快速部署常用功能。
PostgreSQL 的 pg_cheat_funcs 扩展是什么?
pg_cheat_funcs 是 DBA 常用的扩展函数库,集合了一批日常运维和开发的小工具函数(如转义、格式转换、调试辅助等)。它把散落的“作弊”函数打包,省去 DBA 手工创建 UDF 的麻烦。属于轻量级实用函数集,适合快速获得常用工具函数。
PostgreSQL 的 pg_crash 模拟 crash 插件是什么?
pg_crash 是模拟数据库 crash 的插件,用于测试崩溃恢复、主备切换、故障演练等场景。它能人为触发 backend 崩溃或 postmaster 崩溃,验证 HA 机制和恢复流程是否可靠。这是混沌工程(chaos engineering)在数据库测试里的应用。
PostgreSQL 的 pg_hashids 短 ID 生成器是什么?
pg_hashids 是短唯一 ID 生成器(Hashids 算法),把整数编码成短字符串(如 YouTube 风格的短 ID),并可从短 ID 还原整数。相比 UUID(长且无序),hashids 短、可读、可逆,适合短链接、邀请码、订单号展示等场景。它生成的是可逆编码而非随机,需注意隐私(可还原)。
PostgreSQL 的 pg_hint_plan 和 pg_stash_advice 关系是什么?
pg_hint_plan 是成熟的第三方执行计划提示插件,用注释(/*+ SeqScan(t) */)强制指定扫描方式、连接顺序等;pg_stash_advice 是 PG19 预览的官方化计划建议机制。两者目标相同(干预执行计划),但 pg_hint_plan 是插件、功能更成熟,pg_stash_advice 是内核方向。选型上生产环境多用 pg_hint_plan 应急固定计划。
PostgreSQL 的 pg_ivm / pg_imv / pg-trickle 增量物化视图有何区别?
三者都是 PG 的增量物化视图(IVM)方案:pg_ivm 是较成熟的增量物化视图维护扩展,跟踪基表变更增量更新;pg_imv 是实时增量物化视图;pg-trickle 是较新的增量物化视图插件。它们都解决“物化视图只能全量 REFRESH”的痛点,按变更日志(WAL/触发器)只更新受影响的行。选择看功能完整度、性能和维护活跃度。PG 原生 IVM 长期在 wait 列表,尚未落地。
PostgreSQL 的 pg_linegazer 代码覆盖测试插件是什么?
pg_linegazer 是 plpgsql 代码覆盖率测试插件,统计存储过程/函数里哪些代码行被执行过,辅助测试覆盖分析。类似代码覆盖工具(如 gcov),但针对 plpgsql 函数,帮助发现未测试的代码分支,提升存储过程测试质量。
PostgreSQL 的 pg_migrate online DDL with table rewrite 是什么?
pg_migrate 实现 PG 的 online DDL(含表重写),在不锁表的情况下完成需要重写表的变更。它类似 pg_osc,用影子表+增量同步+切换的方式,减少大表 DDL 的停机影响。这类工具解决了 PG 原生 ALTER TABLE 某些变更(改类型、重建表)需 ACCESS EXCLUSIVE 锁重写的痛点。
PostgreSQL 的 pg_prioritize 进程优先级调度插件是什么?
pg_prioritize 是用户进程优先级调度插件,调整不同会话/用户的 CPU 调度优先级(nice 值),让关键业务进程优先获得 CPU。它用 task scheduling 机制隔离优先级,配合资源隔离策略,实现业务分级保障。
PostgreSQL 的 pg_stat_io 视图作用是什么?
pg_stat_io 是 I/O 统计视图,按 backend 类型和 I/O 操作(读、写、扩展、fsync、命中)统计次数和时间。PG16 增强增加 hits 和 IO timing。它是诊断存储性能、buffer 效率的核心视图:能看出哪些操作是瓶颈、命中率如何、fsync 开销多大。配合 pg_stat_get_backend_io 可细化到单进程。
PostgreSQL 的 pg_stat_wal 和 pg_stat_checkpointer 监控什么?
pg_stat_wal 统计 WAL 生成量、写入、同步、满页写等,评估 WAL 活动和写放大;pg_stat_checkpointer 统计 checkpoint 的触发次数、耗时、写 buffer 数,评估 checkpoint 频率和开销。两者配合可分析 checkpoint 导致的性能抖动(checkpoint 时写放大和 IO 尖峰),是调优 checkpoint 参数的依据。
PostgreSQL 的 pg_transport / pgtransfer 表传输功能是什么?
pg_transport/pgtransfer 是表传输工具/插件,在不同数据库实例间传输表数据(结构和数据),类似表级导入导出,但更高效。它适合按表粒度做数据迁移、同步,比全库 dump 更灵活。
PostgreSQL 的 pg_trgm_pro 文本相似搜索是什么?
pg_trgm_pro 是 pg_trgm 的增强,提供“包含则返回 1,不包含则计算 token 相似百分比”的语义,用于文本相似度搜索和排序。它比 pg_trgm 的 similarity 更贴近业务语义(包含优先,否则按相似度)。适合“先精确包含、再相似兜底”的搜索场景。
PostgreSQL 的 pg_upgrade –link 和 –copy-file-range 区别?
pg_upgrade 的 –link 用硬链接(不复制数据文件,只建链接),升级最快但要求新旧数据目录在同一文件系统,且升级后旧目录不能删(共享 inode);–copy-file-range 用 copy_file_range 系统调用(COW/reflink),也快且支持写时复制。默认是普通复制(最慢但最安全)。选型:同文件系统且磁盘够用 –link,否则 –copy-file-range,最稳妥用默认复制。
PostgreSQL 的 pg_waldump 和 pg_walinspect 区别?
pg_waldump 是命令行工具,解析 WAL 文件内容(record 类型、relation、LSN),需在 OS 执行;pg_walinspect 是 PG15 的 SQL 接口,用函数在库内解析 WAL。两者功能类似(查看 WAL 内容),pg_walinspect 更便捷(SQL 调用、可 join 分析)。用途:排查复制延迟、WAL 膨胀、逻辑解码问题。
PostgreSQL 的 pgbench 压测工具用法要点是什么?
pgbench 是 PG 内置压测工具,支持内置测试(TPC-B 类似)和自定义脚本(-f)。要点:-c 客户端数、-j 线程数、-T 时长、-M prepared 使用绑定变量、-n 跳过 vacuum、-r 报告每条语句延迟、-P 周期输出进度。自定义脚本用 \set 定义变量、\gset 存查询结果、random/permute 生成随机数据。压测要预热、控制变量、观察 TPS/延迟分布。
PostgreSQL 的 pgreplay / sqlreplay 负载回放是什么?
pgreplay 是 SQL 回放工具,把数据库的日志(csvlog)或审计日志解析成 SQL 语句,按原始时间节奏重新执行,用于模拟真实负载、性能测试、升级前验证。它保留了原始 SQL 的执行顺序和时延分布,比随机压测更能还原生产负载。适合在测试环境回放生产日志,评估升级、调参、扩容的效果。
PostgreSQL 的 pgroonga 外部加速器全文检索是什么?
pgroonga 基于 Groonga 全文检索引擎,作为 PG 的外部加速器,提供高性能全文检索,支持中文、日文等多语言分词,以及 JSON 模糊查询。相比内置 tsvector,pgroonga 分词更智能(无需手工配置词典)、支持更多语言,适合对全文检索质量要求高的场景。它是 PG 全文检索的重要增强方案。
PostgreSQL 的 plotpg 和 pgcharts 图表化插件是什么?
plotpg 是绘图插件,在数据库内生成图表(如曲线图、散点图);pgcharts 是 SQL 结果图表化插件,把查询结果可视化。它们让 DBA/分析师在库内直接出图,无需导出数据到外部 BI 工具,适合快速可视化分析。
PostgreSQL 的 plpgsql %TYPE 和 %ROWTYPE 数组变量是什么?
%TYPE 引用某列的类型,%ROWTYPE 引用某表/游标的整行结构,PG17 预览支持定义 %TYPE 和 %ROWTYPE 的数组变量类型,例如 v_arr col%TYPE[]。这让 plpgsql 里能声明与表结构绑定的数组,随表结构变化自动调整,减少硬编码类型带来的维护成本,提升了函数对表结构的自适应性。
PostgreSQL 的 pq_trace(libpq 协议跟踪)是什么?
PQTrace 是 libpq 的协议层跟踪功能,打印 frontend(客户端)和 backend(服务端)之间的协议交互(SQL 发送、结果返回、错误消息)。用于调试客户端驱动、分析协议行为、定位应用与数据库交互问题。是数据库通信层排障的底层工具。
PostgreSQL 的 range 类型支持哪些操作,PG18 增强了什么?
range 类型(int4range、tsrange、daterange 等)表示区间,支持包含(@>)、相交(&&)、并(+)、差(-)等操作,配合 GiST 索引加速区间查询。PG18 为 range 增加 GiST 和 B-tree 的 sortsupport,加速比较排序。range 常用于会议室时间不交叉、版本有效期、价格区间等场景,配合排他约束实现区间互斥。
PostgreSQL 的 regexp 正则操作符有哪些?
PG 用 POSIX 正则:~ 匹配、* 不区分大小写匹配、! 不匹配、!~* 不区分大小写不匹配,配合 regexp_replace、regexp_matches、regexp_split_to_table 等函数。PG15 起 regexp_xxx 系列对齐 Oracle(REGEXP_SUBSTR、REGEXP_INSTR、REGEXP_COUNT)。正则用于文本清洗、模式提取、校验,注意正则无索引、大文本正则可能较慢。
PostgreSQL 的 rewrite(规则重写器)做什么?
rewrite 阶段在 query tree 生成后,应用规则系统(rule)重写查询,例如视图展开(把视图替换为基表查询)、INSTEAD 规则改写 DML。它把逻辑查询转换为物理可执行的形式,是 PG 查询处理的中间阶段(parser -> analyze -> rewrite -> planner -> executor)。rule 机制和视图都依赖 rewrite。
PostgreSQL 的 rule(规则)和 trigger 有什么区别,怎么选?
rule 是查询重写规则,在语句解析后改写查询计划(如视图的 DO INSTEAD 规则),属于语句级、发生在计划生成前;trigger 是事件驱动的存储过程,发生在数据行操作时,是行级/语句级。rule 常用于视图的可更新实现、条件重写;trigger 用于数据校验、审计、复杂逻辑。一般能用 trigger 就别用 rule(rule 语义复杂、易踩坑),rule 主要留给视图内部机制。
PostgreSQL 的 sequence 迁移同步怎么做?
序列迁移同步需保证目标库的 sequence 当前值不低于源库,避免新插入值冲突。方法:用 pg_dump 导出时含 sequence setval,或迁移后手工 SELECT setval(‘seq’, (SELECT max(id) FROM t)) 校准。逻辑复制场景 PG15 起支持序列变更复制,主备/双活下自动同步序列值。核心是迁移后校准序列当前值到数据最大值之上。
PostgreSQL 的 set_user 权限控制插件是什么?
set_user 是 ACL 增强插件,提供受控的权限切换功能,允许会话临时切换到指定用户(set_user),用于权限分离、最小权限原则的实施。它比 SET ROLE 更严格,支持密码保护、白名单控制,适合应用连接时从高权限切换到低权限执行业务,降低风险。
PostgreSQL 的 smlar 相似文本搜索插件是什么?
smlar 是文本相似搜索插件,支持多种相似度算法(余弦、重叠系数、TF-IDF 等),用于“自助选药、相似人群圈选、相似文本”等业务。它把文本/标签转为向量后计算相似度,配合 GIN 索引加速。相比 pg_trgm 的 n-gram 相似,smlar 更偏向量化相似,适合标签集合的相似匹配。
PostgreSQL 的 table sample 随机采样有哪些方式?
table sample 用于在表上做快速近似随机采样,语法 SELECT … FROM t TABLESAMPLE SYSTEM(10),SYSTEM 按数据页采样、速度快但行数近似;BERNOULLI 按行采样、结果更均匀但更慢。还可加载 tsm_system_rows、tsm_system_time 扩展,前者按目标行数采样(TABLESAMPLE SYSTEM_ROWS(1000)),后者按时间限制采样(SYSTEM_TIME)。相比 ORDER BY random() LIMIT N 全表排序的方式,table sample 不需要排序全表,适合大表快速抽样分析。
PostgreSQL 的 tbls schema document 工具是什么?
tbls 是数据库 schema 文档生成工具,自动生成对象关系 ER 图、注释、函数等文档。它把数据库结构导出为 markdown/HTML 文档,便于团队理解和维护数据模型。类似“数据库的 README 生成器”,是文档化和知识沉淀的工具。
PostgreSQL 的 tsvector 类型和全文检索怎么用?
tsvector 是全文检索的文档向量类型,把文本分词后存储词条+位置,配合 tsquery(查询向量)和 @@ 匹配操作符做全文搜索,用 GIN 索引加速。流程:to_tsvector 生成文档向量、plainto_tsquery/websearch_to_tsquery 生成查询,@ 用 @@ 匹配并可用 ts_rank 排序。支持中文需配置分词(如 zhparser、pg_jieba)。全文检索适合文档、日志、内容搜索,比 like 更智能(分词、词干、权重)。
PostgreSQL 的 unnest multirange 是什么?
PG14 引入 multirange 类型(多个不相交 range 的集合),PG15 预览 unnest 支持展开 multirange,把它拆成一个个独立的 range 行,例如 unnest(’{[1,3),[5,7)}’::int4multirange) 得到两个 range。这方便对 multirange 做行级处理、与 range 函数联动,是 range 类型家族向多区间场景的扩展。
PostgreSQL 的压缩函数(zstd/gzip)接口是什么?
PG 提供压缩函数接口:gzip 插件提供压缩/解压 text 和 bytea 的函数;zstd 插件提供 zstd 压缩函数,压缩比和速度通常优于 gzip。这些函数让数据在存入前压缩、取出后解压,节省存储空间。PG14 起内置支持 lz4、zstd(用于 TOAST、WAL、备份),压缩能力从插件走向内核。
PostgreSQL 的字符集与 collate 由什么决定?libc 和 ICU 有什么区别?
字符集(encoding)决定字节如何编码,collate/ctype 决定排序和大小写规则,PG 的 collation 底层可基于 libc 或 ICU。libc 依赖操作系统本地化数据,不同 OS 排序结果可能不一致且无法在运行时更改;ICU 是独立于 OS 的国际化库,支持更多特性(如大小写不敏感、口音不敏感、按拼音/笔画排序),且版本可随数据库迁移。推荐新库优先使用 ICU collation,避免跨平台排序漂移。
PostgreSQL 的存储过程(procedure)和函数(function)有什么区别?
函数(function)必须有返回值,可在 SQL 里调用,不能包含事务控制(COMMIT/ROLLBACK);存储过程(procedure,PG11 起)可用 CALL 调用,支持事务控制(内部可 COMMIT/ROLLBACK 管理事务边界),适合需要分步提交的批处理。函数适合计算、可嵌入查询;过程适合复杂的多步事务逻辑。两者在 PG 里都用 plpgsql 等过程语言编写。
PostgreSQL 的数组元素模糊搜索的倒排索引原理是什么?
数组/JSON 元素的模糊搜索建倒排索引:把每个元素(或元素的 n-gram)作为索引键,指向包含它的行。查询时从索引快速定位候选行,再精确过滤。插件如 parray_gin 直接对数组元素建 GIN,pg_trgm/pg_bigm 对元素文本建 n-gram 倒排。核心是把“包含某个元素/子串”的扫描转为索引查找,避免逐行 unnest 全表扫。
PostgreSQL 的数组模糊搜索如何实现?有哪些插件?
数组元素的模糊搜索(like、正则、前缀)可借助插件:parray_gin 支持数组/JSON 内元素的 GIN 模糊匹配索引;pg_trgm 和 pg_bigm 提供三字/双字图索引加速 like ‘%xxx%’。其中 pg_bigm 支持 2-gram,对短词和中文(2字)比 pg_trgm(3-gram)更友好,能索引更短的查询串。此外数组可 unnest 展开后配合普通索引或 tsvector 全文检索。核心思路是给数组内容建倒排索引,避免逐行展开全扫。
PostgreSQL 的模糊搜索应用(pg_trgm vs pg_bigm vs pgroonga)怎么选?
pg_trgm 用 3-gram(三元组),适合 3 字符以上的子串模糊匹配和相似度;pg_bigm 用 2-gram,支持更短查询串(2 字符),对中文和短词更友好,但索引更大;pgroonga 基于 Groonga 引擎,支持更复杂的全文检索、JSON 模糊查询和多字节字符。选型:英文长词模糊用 pg_trgm,中文/短词用 pg_bigm,复杂全文+JSON 用 pgroonga。都用 GIN 索引加速。
PostgreSQL 的物化视图(materialized view)和增量物化视图(IVM)是什么?
普通视图是查询的别名,不存储数据;物化视图把查询结果物化存储,可 REFRESH 刷新,但刷新是整体的(需重建)。PG 原生不支持基于日志的增量刷新,因此有第三方 IVM(增量物化视图维护)方案:pg_ivm、pg_imv、pg-trickle 等,跟踪基表变更,只增量更新受影响的物化行,避免全量刷新。IVM 适合大表上需要近实时、又不想全量刷新的聚合视图场景。
PostgreSQL 的窗口函数 frame(帧)如何控制计算范围?
窗口函数在 OVER 子句里用 PARTITION BY 分组、ORDER BY 排序,并用 frame(帧)界定每行参与计算的行范围。帧可用 ROWS(按物理行数,如 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)或 RANGE(按值的范围),GROUPS 则按 peer 组。默认帧在无 ORDER BY 时是整个分区,有 ORDER BY 时是 RANGE UNBOUNDED PRECEDING 到 CURRENT ROW。帧是窗口内滑动计算的核心,直接影响累计求和、移动平均等结果。
PostgreSQL 的约束延判 deferrable 是什么,什么场景用?
deferrable 约束允许把唯一、主键、外键、exclude 等约束的检查推迟到事务提交时(SET CONSTRAINTS … DEFERRED),默认是 IMMEDIATE 立即检查。典型场景是成对更新存在相互引用关系的行,比如 A 引用 B、B 引用 A 时,先插任意一边都会违反外键,用 deferrable 约束在事务内先插两边、提交时再统一校验即可。它增加了灵活性,但会推迟错误发现、增大事务提交时的校验开销。
PostgreSQL 的自定义类型(CREATE TYPE)怎么用?
CREATE TYPE 定义新数据类型:可定义复合类型(CREATE TYPE … AS (字段列表))、枚举类型(AS ENUM)、或基于内置类型加约束的 domain。复合类型相当于结构体,枚举适合有限取值集合。自定义类型让数据模型更贴合业务语义,配合类型转换函数和操作符可完全定制行为。
PostgreSQL 的自定义聚合函数的 finalfunc 如何保证只执行一次?
自定义聚合函数由 state transition function(逐行累加)和 final function(最终转换)组成。finalfunc 通常应在整个分组聚合结束后只执行一次,但若写成对每个输入都调用就会错误。正确做法是用 CREATE AGGREGATE 的 SFUNC + FINALFUNC 结构:sfunc 处理每条输入更新中间状态,finalfunc 只把最终状态转为输出值,由聚合执行器保证 finalfunc 仅调用一次。作者曾因理解偏差“以为 finalfunc 会执行多次”,实际聚合框架保证其单次执行。
PostgreSQL 的随机唯一有范围序列生成器怎么实现?
生成随机、唯一、有取值范围的序列,可用 random() 变换到目标范围 + 唯一约束去重,或用加密洗牌(如 Feistel 置换)实现区间内无重复伪随机。简单做法:generate_series 生成全部候选值,order by random() 打散后取前 N,保证唯一。高性能场景用可逆置换函数(一对一映射)在范围内产生不重复随机值,避免冲突重试。
PostgreSQL 的随机数据生成有哪些方法?
常用方法:random() 生成 01 随机数,可变换为任意范围(100+ceil(random()*400) 生成 100500 整数);gen_random_uuid()(需 pgcrypto)生成 UUID;md5(random()::text) 生成随机字符串;generate_series 批量生成行。PG17 起 random(min,max) 直接生成区间内随机数,PG19 又扩展到 date/timestamp 类型。批量测试数据通常用 generate_series + 这些随机函数一次性生成,避免逐行循环。
PostgreSQL 的高效精确数值类型 pg_rational 是什么?
pg_rational 是扩展提供的精确有理数类型,用分子/分母存储分数,避免浮点数的精度损失(如 1/3 在 float 里是近似值)。它适合需要精确分数运算的场景(财务、科学计算)。相比 NUMERIC 用十进制定点,pg_rational 用有理数表示,除法结果精确。代价是运算和存储开销高于普通浮点。
PostgreSQL 递归 CTE 的 recursive_worktable_factor 参数是做什么的?
它设置优化器对递归查询 work table 平均记录数的估算倍数,即评估为非递归初始项的多少倍,默认 10.0。此前该倍数被写死为 10 倍,但不同场景差异很大:图全展开每层可能是上层的 N 倍,而最短路径查询每层只返回 1 条(倍数应接近 1)。调小(如 1.0)适合低扇出的最短路径查询,图分析类可调大,帮助优化器选择更合适的 work table 连接方式。
WITH RECURSIVE 递归 CTE 的 SEARCH 和 CYCLE 语法分别解决什么问题?
SEARCH 子句(PG14)支持广度优先(BREADTH FIRST)或深度优先(DEPTH FIRST)搜索,并按指定列生成搜索序序列号列,方便图式搜索控制遍历顺序;CYCLE 子句用于检测递归中的环,生成标记列指示是否形成环并记录循环路径。它们由 rewriter 改写成现有语法实现。注意 CYCLE 默认已按深度优先计算路径列,若只用深度优先可省略 SEARCH;需要广度优先时再同时写 SEARCH 和 CYCLE。
为什么 JSON 可能“污染”PostgreSQL 数据库?
JSON/JSONB 若被滥用会带来问题:把大量结构化数据塞进 JSONB 导致查询无法走常规索引、类型约束失效、数据冗余(JSONB 存储比原生类型大)、无 schema 约束易产生脏数据、GIN 索引维护开销大等。JSONB 适合半结构化、灵活 schema 的场景,不应替代关系模型存储强结构数据。合理做法是结构化字段用原生列,仅灵活部分用 JSONB,并配合 jsonpath 和表达式索引。
为什么 where x=round(random()*N) 这类查询结果会反常?背后的函数稳定性是什么?
因为 random() 是 volatile 函数,每次调用都返回不同值,导致 WHERE 条件里对每一行重新求值,行为不可预测。PG 把函数稳定性分为三档:immutable(相同入参永远相同结果,可安全用于索引/常量折叠)、stable(同一语句内结果稳定,可优化)、volatile(每次调用都可能不同,禁止大部分优化)。random() 属于 volatile,所以不能放进表达式索引、不能在 planner 里预计算,WHERE 中每次求值都会变。
为什么窗口函数里不能直接用 DISTINCT(如 count(distinct x) over()),怎么解决?
PG 的窗口函数聚合内部长期不支持 DISTINCT,直接写 array_agg(DISTINCT week) OVER(…) 会报 DISTINCT is not implemented for window functions。解决方法是先用子查询把窗口内需要的行聚合出来,再在外层对聚合结果做 distinct 处理,例如先 array_agg(week) OVER(帧),再在外层用 (SELECT array_agg(DISTINCT unnest) FROM unnest(x)) 去重。本质是窗口聚合是逐行滑动的,distinct 语义与帧边界冲突。
用 PostgreSQL 的 exclude 排他约束如何实现“一对一结伴”(A组和B组结伴后不能再与他人结伴)?
利用 exclude 约束绑定一对一关系:建表时 exclude using gist (id1 with =, id2 with <>),需要先 create extension btree_gist。该约束含义是:在 id1 相同的前提下,id2 不允许出现不同的值,即同一个 id1 只能绑定一个 id2,实现严格的一对一结伴。排他约束本质是“任意两行不满足指定操作符谓词”的通用约束,用 = 和 <> 组合可表达“同组内字段必须相等”这类关系约束,比普通唯一约束更灵活。
用 exclude 约束如何实现“行政区不跨界”和“会议室时间不交叉”?
空间跨界用 exclude using gist (l1 with <>, geo1 with &&) 表示:不同 l1(省ID)的多边形 geo1 不允许相交,即不同省边界不能重叠;会议室时间不交叉用 exclude using gist (room_id with =, tsrange with &&),表示同一会议室的时间范围不允许重叠。这些都需要 btree_gist 和 postgis/gist 范围索引支持。注意同一 ID 内部的多条记录无法用该约束强制不同(例如同一个 l1 内的多条记录仍可相交),这是排他约束按“任意两行”校验的局限。