PostgreSQL SELECT DISTINCT
性能瓶颈与优化策略
对包含近 200 万条记录的 PostgreSQL 表进行 SELECT DISTINCT
查询表现出意外的缓慢性能(500-600 毫秒)。 查询规划器莫名其妙地默认为顺序扫描,而不是利用可用索引,甚至索引强制也不会显着提高执行时间。
在 PostgreSQL 中模拟索引跳跃扫描
由于 PostgreSQL 缺乏本机索引跳过扫描功能,因此使用递归公用表表达式 (CTE) 的解决方法可以模仿其行为。 此 CTE 按升序迭代检索不同的产品 ID,利用 product_id
上的索引来提高效率:
<code class="language-sql">WITH RECURSIVE cte AS ( ( SELECT product_id FROM tickers ORDER BY 1 LIMIT 1 ) UNION ALL SELECT l.* FROM cte c CROSS JOIN LATERAL ( SELECT product_id FROM tickers t WHERE t.product_id > c.product_id ORDER BY 1 LIMIT 1 ) l ) SELECT * FROM cte;</code>
与全表扫描相比,这种方法提供了显着的性能提升。
替代方法:DISTINCT
和 DISTINCT ON
对于每个唯一产品 ID 的行分布更均匀的表,标准 DISTINCT
或 DISTINCT ON
关键字可能比模拟索引跳过扫描更快。 它们的性能在很大程度上取决于数据分布。
未来改进:本机索引跳过扫描
PostgreSQL 开发包括集成本机索引跳过扫描功能的持续工作。 这项未来的增强功能有望进一步优化 SELECT DISTINCT
查询的性能。
以上是为什么我的 PostgreSQL SELECT DISTINCT 查询如此慢,如何提高其性能?的详细内容。更多信息请关注PHP中文网其他相关文章!