首页 >数据库 >mysql教程 >为什么我的 PostgreSQL SELECT DISTINCT 查询如此慢,如何提高其性能?

为什么我的 PostgreSQL SELECT DISTINCT 查询如此慢,如何提高其性能?

Barbara Streisand
Barbara Streisand原创
2025-01-07 18:17:40269浏览

Why is my PostgreSQL SELECT DISTINCT query so slow, and how can I improve its performance?

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>

与全表扫描相比,这种方法提供了显着的性能提升。

替代方法:DISTINCTDISTINCT ON

对于每个唯一产品 ID 的行分布更均匀的表,标准 DISTINCTDISTINCT ON 关键字可能比模拟索引跳过扫描更快。 它们的性能在很大程度上取决于数据分布。

未来改进:本机索引跳过扫描

PostgreSQL 开发包括集成本机索引跳过扫描功能的持续工作。 这项未来的增强功能有望进一步优化 SELECT DISTINCT 查询的性能。

以上是为什么我的 PostgreSQL SELECT DISTINCT 查询如此慢,如何提高其性能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn