PostgreSQL menyediakan pelbagai kaedah untuk memilih baris rawak dengan cekap.
Kaedah ini menggunakan fungsi random()
dan klausa LIMIT
:
<code class="language-sql">SELECT * FROM table ORDER BY random() LIMIT 1000;</code>
Namun, untuk meja besar, kaedah ini mungkin lebih perlahan kerana ia memerlukan imbasan jadual penuh.
Kaedah ini menggunakan indeks kunci utama untuk mengoptimumkan pertanyaan:
<code class="language-sql">WITH params AS ( SELECT 1 AS min_id, -- 最小ID (大于等于当前最小ID) , 5100000 AS id_span -- 四舍五入 (max_id - min_id + 缓冲) ) SELECT * FROM ( SELECT p.min_id + trunc(random() * p.id_span)::integer AS id FROM params p , generate_series(1, 1100) g -- 1000 + 缓冲 GROUP BY 1 -- 去除重复项 ) r JOIN table USING (id) LIMIT 1000; -- 去除多余项</code>
Kaedah ini lebih pantas daripada kaedah satu kerana ia menggunakan imbasan indeks dan bukannya imbasan jadual penuh.
Kaedah ini menggunakan ungkapan jadual biasa rekursif (CTE) untuk mengendalikan nilai yang tiada dalam lajur ID:
<code class="language-sql">WITH RECURSIVE random_pick AS ( SELECT * FROM ( SELECT 1 + trunc(random() * 5100000)::int AS id FROM generate_series(1, 1030) -- 1000 + 百分几 - 根据需要调整 LIMIT 1030 -- 查询规划器提示 ) r JOIN table b USING (id) -- 去除缺失值 UNION -- 去除重复项 SELECT b.* FROM ( SELECT 1 + trunc(random() * 5100000)::int AS id FROM random_pick r -- 加上百分几 - 根据需要调整 LIMIT 999 -- 小于1000,查询规划器提示 ) r JOIN table b USING (id) -- 去除缺失值 ) TABLE random_pick LIMIT 1000; -- 实际限制</code>
PostgreSQL 9.5 memperkenalkan sintaks TABLESAMPLE SYSTEM (n)
, dengan n ialah peratusan antara 0 dan 100:
<code class="language-sql">SELECT * FROM big TABLESAMPLE SYSTEM ((1000 * 100) / 5100000.0);</code>
Kaedah ini pantas, tetapi mungkin tidak mengembalikan sampel yang benar-benar rawak kerana kesan pengelompokan.
Jika jadual mempunyai beberapa nilai yang hilang untuk lajur ID dan indeks kunci utama telah disediakan, Kaedah dua (kaedah berasaskan indeks) ialah pilihan terbaik kerana ia memberikan kelajuan dan seks ketepatan.
Untuk jadual dengan banyak nilai yang hilang, sila pertimbangkan Kaedah 3 (CTE rekursif), yang boleh mengendalikan nilai yang hilang dengan berkesan.
Kaedah satu (random()
dan limit
) mempunyai prestasi yang lebih rendah dan harus digunakan dengan jadual yang lebih kecil.
Kaedah 4(TABLESAMPLE SYSTEM
) adalah pantas, tetapi tidak setepat kaedah lain. Ia boleh digunakan untuk membuat anggaran pantas pada jadual besar.
Atas ialah kandungan terperinci Bagaimanakah saya boleh memilih baris rawak dengan cekap dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!