Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan DISTINCT PostgreSQL SELECT Saya dengan Kunci Utama Komposit Sangat Lambat?

Mengapa Pertanyaan DISTINCT PostgreSQL SELECT Saya dengan Kunci Utama Komposit Sangat Lambat?

Linda Hamilton
Linda Hamiltonasal
2025-01-07 18:23:40599semak imbas

Why is My PostgreSQL SELECT DISTINCT Query with a Composite Primary Key So Slow?

PostgreSQL SELECT DISTINCT Isu Prestasi dengan Kekunci Komposit

Menggunakan SELECT DISTINCT pada jadual PostgreSQL dengan kunci utama komposit (cth., (product_id, trade_id)) boleh menjadi sangat perlahan. Perancang pertanyaan selalunya memilih imbasan berurutan dan bukannya menggunakan indeks dengan cekap.

Kenapa Lambat?

  • Keutamaan Imbasan Berjujukan: Perancang mungkin lebih suka imbasan jadual penuh, walaupun dengan indeks, yang membawa kepada masa pertanyaan yang jauh lebih lama.
  • Imbasan Langkau Indeks Hilang: PostgreSQL tidak menyokong imbasan langkau indeks secara asli, pengoptimuman yang cekap mendapatkan nilai unik dengan melangkau pendua dalam indeks.

Penyelesaian: Mensimulasikan Imbasan Langkau Indeks dengan CTE

Walaupun imbasan langkau indeks sebenar tidak tersedia, kami boleh meniru gelagatnya dengan berkesan menggunakan Ungkapan Jadual Biasa (CTE) rekursif:

<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 ini berulang melalui nilai product_id unik dalam tertib diisih, memanfaatkan indeks pada (product_id) untuk kecekapan.

Kelebihan Pendekatan ini

  • Peningkatan Kelajuan: Kaedah ini secara drastik mengurangkan masa pelaksanaan pertanyaan. Ujian menunjukkan pengurangan kepada 0.75 milisaat pada jadual 2.25 juta baris.
  • Penggunaan Indeks: Ia menggunakan kedua-dua indeks kunci primer komposit (product_id, trade_id) dan indeks pada (product_id) dengan berkesan.
  • Agnostik Pengedaran Data: Prestasi kekal konsisten tanpa mengira pengedaran data dalam jadual.

Atas ialah kandungan terperinci Mengapa Pertanyaan DISTINCT PostgreSQL SELECT Saya dengan Kunci Utama Komposit Sangat Lambat?. 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