内容提要
PostgreSQL 18 引入“跳过扫描”性能特性:针对复合 B 树索引,当首列不同值较少时,查询可跳过不匹配的首列值,直接定位下一组,避免全索引扫描。示例中查询从 66 毫秒降至 0.6 毫秒。该功能默认启用,无需用户操作,无已知性能退化风险,但仅适用于 B 树索引,且首列不同值不宜过多。
延伸解读
跳过扫描的适用条件
跳过扫描并非万能,其效果高度依赖数据分布。文章指出,只有当复合B树索引的首列不同值较少时,查询才能通过跳过不匹配的首列值来避免全索引扫描。如果首列不同值过多,可跳过的空间有限,性能提升可能不明显。因此,在实际应用中,需评估索引首列的选择性,典型场景如“国家-电话号码”或“汽车制造商-车牌号”等首列基数低的组合。
性能提升的实测与预期
文章通过一个示例展示了跳过扫描的显著效果:查询执行时间从66毫秒降至0.6毫秒。作者强调,虽然这是一个教学示例,但在真实世界中,只要数据分布合适,同样可能获得大幅性能提升。不过,读者应注意,实际收益取决于具体的数据分布和查询模式,并非所有查询都能达到如此高的加速比。
默认启用与无退化风险
跳过扫描功能在PostgreSQL 18中默认启用,用户无需进行任何配置或操作即可受益。文章提到,目前没有已知的会导致性能退化的边界情况。这意味着升级到PostgreSQL 18后,符合条件的查询会自动优化,无需担心引入额外的调优负担。但需注意,该功能仅适用于B树索引,不适用于GIN、GiST等其他索引类型。
Q&A
PostgreSQL 18 的跳过扫描是什么?
跳过扫描是 PostgreSQL 18 引入的一种性能优化特性,针对复合 B 树索引,当索引首列的不同值较少时,查询可以跳过不匹配的首列值,直接定位到下一组,从而避免全索引扫描,提升查询效率。
跳过扫描如何提升查询性能?
跳过扫描通过跳过复合索引中不匹配的首列值,直接跳转到下一个不同的首列值,从而减少扫描的数据量。例如,在示例中,查询时间从 66 毫秒降至 0.6 毫秒。
使用跳过扫描需要满足哪些条件?
跳过扫描仅适用于 B 树索引,并且索引首列的不同值不宜过多。如果首列不同值太多,则没有可跳过的值,优化效果不明显。
启用跳过扫描需要手动配置吗?
不需要。跳过扫描在 PostgreSQL 18 中默认启用,用户无需进行任何操作即可受益。
跳过扫描有哪些潜在风险或限制?
目前没有已知的性能退化风险。但跳过扫描仅对 B 树索引有效,不适用于 GIN、GiST 等其他索引类型。此外,如果索引首列的不同值过多,跳过扫描的效果会受限。
能否举例说明跳过扫描的实际应用场景?
例如,在包含“国家/地区”和“电话号码”的复合索引中,如果国家/地区列的不同值较少,查询特定电话号码时,跳过扫描可以跳过不匹配的国家/地区,快速定位到目标电话号码,从而大幅提升查询速度。