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中文網其他相關文章!