首頁 > 資料庫 > mysql教程 > 為什麼 PostgreSQL 中複合主鍵的表上 SELECT DISTINCT 很慢,如何最佳化?

為什麼 PostgreSQL 中複合主鍵的表上 SELECT DISTINCT 很慢,如何最佳化?

Patricia Arquette
發布: 2025-01-07 18:27:40
原創
749 人瀏覽過

PostgreSQL 中使用複合主鍵的表上 SELECT DISTINCT 查詢速度慢的原因及最佳化方法

Why is SELECT DISTINCT Slow on a Table with a Composite Primary Key in PostgreSQL, and How Can It Be Optimized?

在 PostgreSQL 資料庫中,SELECT DISTINCT 查詢的執行速度取決於表格結構和資料分佈。雖然 tickers 表中的 product_id 欄位是複合主鍵的一部分,因此在其上建立了索引,但使用 SELECT DISTINCT product_id FROM tickers 取得唯一 product_id 的查詢預設會執行順序掃描。

表現慢的原因

表現慢的主要原因是表中存在 product_id 的重複值。這意味著對於每個檢索到的唯一 product_id,PostgreSQL 必須掃描整個表以確保不存在重複項。

解決方法:模擬索引跳躍掃描

由於 PostgreSQL 尚未原生支援索引跳躍掃描,因此可以使用遞歸 CTE (公用表表達式) 來模擬此行為。此 CTE 迭代地檢索並丟棄重複項,有效地過濾掉除每個唯一 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
   )
TABLE  cte;</code>
登入後複製

此查詢使用橫向連接來遍歷排序後的表,並使用 orderBy 檢索唯一的 product_id 值。

結論

透過使用 CTE 方法模擬索引跳躍掃描,可以顯著提高 SELECT DISTINCT product_id 查詢的執行時間,從而減少從 tickers 表檢索唯一 product_id 所需的時間。

以上是為什麼 PostgreSQL 中複合主鍵的表上 SELECT DISTINCT 很慢,如何最佳化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板