PostgreSQL SELECT DISTINCT
复合键的性能问题
在具有复合主键(例如 SELECT DISTINCT
)的 PostgreSQL 表上使用 (product_id, trade_id)
可能会非常慢。 查询规划器经常选择顺序扫描,而不是有效地利用索引。
为什么这么慢?
解决方案:使用 CTE 模拟索引跳跃扫描
虽然真正的索引跳过扫描不可用,但我们可以使用递归公共表表达式 (CTE) 有效地模仿其行为:
<code class="language-sql">WITH RECURSIVE cte AS ( ( -- parentheses are crucial 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>
此 CTE 按排序顺序迭代唯一的 product_id
值,利用 (product_id)
上的索引来提高效率。
这种方法的优点
(product_id, trade_id)
和(product_id)
上的索引。以上是为什么我的 PostgreSQL 具有复合主键的 SELECT DISTINCT 查询如此慢?的详细内容。更多信息请关注PHP中文网其他相关文章!