Rumah > pangkalan data > tutorial mysql > Bagaimanakah saya boleh memilih baris rawak dengan cekap dalam PostgreSQL?

Bagaimanakah saya boleh memilih baris rawak dengan cekap dalam PostgreSQL?

Linda Hamilton
Lepaskan: 2025-01-21 05:41:08
asal
473 orang telah melayarinya

How can I efficiently select random rows in PostgreSQL?

Kaedah pemilihan baris rawak yang cekap untuk PostgreSQL

PostgreSQL menyediakan pelbagai kaedah untuk memilih baris rawak dengan cekap.

Kaedah 1: Gunakan Klausa Rawak() dan Had

Kaedah ini menggunakan fungsi random() dan klausa LIMIT:

<code class="language-sql">SELECT *
FROM table
ORDER BY random()
LIMIT 1000;</code>
Salin selepas log masuk

Namun, untuk meja besar, kaedah ini mungkin lebih perlahan kerana ia memerlukan imbasan jadual penuh.

Kaedah 2: Kaedah berasaskan indeks

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>
Salin selepas log masuk

Kaedah ini lebih pantas daripada kaedah satu kerana ia menggunakan imbasan indeks dan bukannya imbasan jadual penuh.

Kaedah 3: Gunakan CTE rekursif

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>
Salin selepas log masuk

Kaedah 4: Gunakan SISTEM CONTOH JADUAL (n)

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>
Salin selepas log masuk

Kaedah ini pantas, tetapi mungkin tidak mengembalikan sampel yang benar-benar rawak kerana kesan pengelompokan.

Perbandingan dan cadangan

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan