Rumah >pangkalan data >tutorial mysql >Mengapakah SELECT DISTINCT Lambat pada Jadual dengan Kunci Utama Komposit dalam PostgreSQL, dan Bagaimana Ia Boleh Dioptimumkan?

Mengapakah SELECT DISTINCT Lambat pada Jadual dengan Kunci Utama Komposit dalam PostgreSQL, dan Bagaimana Ia Boleh Dioptimumkan?

Patricia Arquette
Patricia Arquetteasal
2025-01-07 18:27:40751semak imbas

Pada jadual menggunakan kunci utama komposit dalam PostgreSQL SELECT DISTINCT Sebab untuk kelajuan pertanyaan dan kaedah pengoptimuman yang perlahan

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

Dalam pangkalan data PostgreSQL, SELECT DISTINCT kelajuan pelaksanaan pertanyaan bergantung pada struktur jadual dan pengedaran data. Walaupun lajur tickers dalam jadual product_id ialah sebahagian daripada kunci utama komposit dan oleh itu diindeks padanya, pertanyaan yang menggunakan SELECT DISTINCT product_id FROM tickers untuk mendapatkan product_id unik melakukan imbasan berjujukan secara lalai.

Sebab prestasi perlahan

Sebab utama prestasi perlahan

ialah terdapat nilai pendua product_id dalam jadual. Ini bermakna bagi setiap product_id unik yang diambil, PostgreSQL mesti mengimbas keseluruhan jadual untuk memastikan tiada pendua.

Penyelesaian: simulasi imbasan langkau indeks

Memandangkan PostgreSQL belum lagi menyokong imbasan langkau indeks, anda boleh menggunakan CTE rekursif (ungkapan jadual biasa) untuk mensimulasikan tingkah laku ini. CTE ini mengambil semula dan membuang pendua secara berulang, menapis dengan berkesan semua kecuali satu contoh bagi setiap product_id unik.

Penyelesaian yang dipertingkatkan

<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>

Pertanyaan ini menggunakan cantuman mendatar untuk melintasi jadual yang diisih dan mendapatkan nilai orderBy unik menggunakan product_id .

Kesimpulan

Masa pelaksanaan pertanyaan SELECT DISTINCT product_id boleh dipertingkatkan dengan ketara dengan mensimulasikan imbasan langkau indeks menggunakan kaedah CTE, dengan itu mengurangkan masa yang diperlukan untuk mendapatkan tickers unik daripada jadual product_id.

Atas ialah kandungan terperinci Mengapakah SELECT DISTINCT Lambat pada Jadual dengan Kunci Utama Komposit dalam PostgreSQL, dan Bagaimana Ia Boleh Dioptimumkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn