以无索引查询为例:当表大于 shared_buffers 的四分之一时,Postgres 默认启用 synchronize_seqscans,新的顺序扫描会从上次停止处开始。首次扫描耗时 78 毫秒、读取 31598 页;后续仅 0.07 毫秒、读取 14 页,快约 1100 倍,这并非缓存所致。单次 EXPLAIN ANALYZE 只是样本量为 1,应多次运行并比较标准差与均值之比,以识别异常单次结果或累积效应。
Postgres查询性能提升的关键在于理解数据扫描类型,包括顺序扫描、索引扫描和位图索引扫描。顺序扫描适用于小表,逐行检查数据;索引扫描适合大表,通过索引快速定位数据;位图索引扫描结合了两者的优点,适用于多个过滤条件的查询。掌握这些扫描类型有助于优化查询性能。
PostgreSQL 18 取得重大进步,未来可能引入直接 I/O 以绕过操作系统页缓存。测试显示,在双 SSD 上,直接 I/O 使顺序扫描吞吐从约 3.7 GB/s 提升至 6 GB/s,且 CPU 占用更低,内核开销消失。目前仅为调试功能,不建议生产使用。
PostgreSQL 18引入异步I/O(AIO),允许数据库在等待数据时进行计算,从而提升性能。AIO支持三种I/O模式,推荐使用io_uring。测试表明,AIO在大规模操作中显著降低延迟,尤其在顺序扫描时效果明显。
本文讨论了如何通过调整PostgreSQL的查询规划器来强制使用索引。通常情况下,PostgreSQL会选择顺序扫描而非索引扫描,尽管索引扫描可能更优。可以通过将`enable_seqscan`设置为off来强制使用索引,或者通过增加数据量使索引扫描的成本低于顺序扫描,从而促使查询规划器选择索引扫描。
顺序扫描在数据库中被视为性能杀手,但在某些情况下可以提升性能。它是一种访问数据的方法,需要扫描每个记录以满足搜索条件。顺序扫描的成本包括IO和CPU成本。缺乏统计数据或索引可能导致顺序扫描。使用索引可能会导致执行延迟。
完成下面两步后,将自动完成登录并继续当前操作。