Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memilih Baris Rawak dengan Cekap daripada Jadual PostgreSQL Besar?

Bagaimana untuk Memilih Baris Rawak dengan Cekap daripada Jadual PostgreSQL Besar?

Linda Hamilton
Linda Hamiltonasal
2025-01-21 05:46:12618semak imbas

How to Efficiently Select Random Rows from a Large PostgreSQL Table?

Pilih baris rawak daripada jadual PostgreSQL yang besar

Apabila bekerja dengan set data yang besar, memilih baris rawak boleh menjadi tugas yang intensif dari segi pengiraan. Artikel ini meneroka pelbagai kaedah untuk mendapatkan semula baris rawak daripada jadual yang mengandungi kira-kira 500 juta baris dan membincangkan prestasi dan ketepatannya.

Kaedah 1: Gunakan RANDOM() dan LIMIT

Kaedah pertama melibatkan penggunaan fungsi RANDOM() untuk menjana nombor rawak dan kemudian menggunakan klausa LIMIT untuk menapis keputusan untuk mendapatkan bilangan baris yang diperlukan.

<code class="language-sql">SELECT * FROM table WHERE RANDOM() < 0.000002 LIMIT 1000;</code>

Pendekatan ini mempunyai kelebihan kerana mudah dilaksanakan, tetapi mungkin tidak cekap untuk meja besar. Kerana klausa LIMIT, pangkalan data mesti mengimbas semua baris jadual untuk memilih baris rawak dan membuang yang lain.

Kaedah 2: Gunakan ORDER BY RANDOM() dan LIMIT

Pendekatan lain ialah mengisih baris terlebih dahulu mengikut fungsi RANDOM() dan kemudian menggunakan klausa LIMIT untuk mendapatkan baris rawak.

<code class="language-sql">SELECT * FROM table ORDER BY RANDOM() LIMIT 1000;</code>

Kaedah ini serupa dengan kaedah pertama, tetapi pengisihan menjamin pemilihan baris rawak yang lebih cekap. Ia mengurangkan bilangan imbasan yang diperlukan, menjadikannya pilihan yang lebih baik untuk meja besar. Walau bagaimanapun, ia masih bukan pilihan terbaik untuk jadual dengan bilangan baris yang sangat besar.

Pendekatan cekap: gunakan lajur ID angka dan indeks

Untuk jadual dengan lajur ID berangka dan jurang yang lebih sedikit, pendekatan yang lebih cekap boleh digunakan. Ini melibatkan penjanaan nombor rawak dalam julat ID dan menggunakannya untuk bergabung dengan jadual.

<code class="language-sql">WITH params AS (
   SELECT 1 AS min_id,              -- 最小 ID <= 当前最小 ID
        5100000 AS id_span             -- 四舍五入。(max_id - min_id + buffer)
    )
SELECT *
FROM  (
   SELECT p.min_id + trunc(random() * p.id_span)::integer AS id
   FROM   params p, generate_series(1, 1100) g  -- 1000 + buffer
   GROUP  BY 1                        -- 去除重复项
) r
JOIN   table USING (id)
LIMIT  1000;</code>

Pendekatan ini memanfaatkan akses indeks untuk mengurangkan bilangan imbasan yang diperlukan dengan ketara. Ia sesuai untuk jadual dengan bilangan baris yang banyak dan sedikit jurang dalam lajur ID.

Pertimbangan dan Syor

Cara terbaik untuk memilih baris rawak bergantung pada ciri jadual dan keperluan prestasi tertentu. Untuk jadual kecil, kaedah RANDOM() atau ORDER BY RANDOM() mungkin mencukupi. Walau bagaimanapun, untuk jadual besar dengan lajur ID berangka dan sedikit jurang, adalah disyorkan untuk menggunakan kaedah pengoptimuman di atas untuk prestasi terbaik.

Perlu diingat bahawa disebabkan sifat penjanaan nombor pseudo-rawak dalam komputer, tiada satu pun daripada kaedah ini dapat menjamin rawak sebenar. Walau bagaimanapun, mereka menyediakan cara praktikal untuk mendapatkan sampel rawak baris daripada jadual besar dengan kecekapan dan ketepatan yang munasabah.

Atas ialah kandungan terperinci Bagaimana untuk Memilih Baris Rawak dengan Cekap daripada Jadual PostgreSQL Besar?. 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