PostgreSQL SELECT DISTINCT
性能瓶颈:案例研究
本文研究了在包含大约 200 万条记录的 PostgreSQL 表上执行 SELECT DISTINCT
查询时遇到的性能问题。
上下文
tickers
表存储来自 Coinbase Pro 的“股票行情”通道的数据。 复合主键包含 product_id
列。
性能问题
由于 SELECT DISTINCT product_id FROM tickers
上的索引,查询 product_id
预计会表现良好。 然而,执行始终需要 500-600 毫秒。
查询计划调查
EXPLAIN ANALYZE
显示查询规划器默认为顺序扫描,忽略 product_id
索引。 强制使用索引并没有解决性能问题。
索引优化尝试
在 product_id
上创建专用索引仅产生了微小的改进,除非明确覆盖,否则计划者仍然首选顺序扫描。
有效的解决方案:索引跳过扫描模拟
实现的解决方案使用带有横向连接的递归查询来模拟索引跳过扫描。这种方法显着提高了性能,即使对于 225 万行的数据集,执行时间也缩短至 0.75 毫秒。
总结
PostgreSQL 当前缺乏本机索引跳过扫描功能的问题可以通过这种模拟技术解决。 该方法有效地利用了现有索引,并避免了大型表上SELECT DISTINCT
查询的顺序扫描的性能损失。
以上是为什么我的 PostgreSQL `SELECT DISTINCT` 这么慢,我该如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!