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