首頁 > 資料庫 > mysql教程 > 如何從大型 PostgreSQL 表中有效地選擇隨機行?

如何從大型 PostgreSQL 表中有效地選擇隨機行?

Barbara Streisand
發布: 2025-01-21 05:37:09
原創
881 人瀏覽過

How Can I Efficiently Select Random Rows from a Large PostgreSQL Table?

從PostgreSQL等大型資料庫中隨機選擇行,可能是效能密集型任務。本文探討兩種高效實現此目標的常用方法,並討論其優缺點。

方法一:以隨機值過濾

<code class="language-sql">select * from table where random() < 0.01;</code>
登入後複製

此方法隨機對行進行排序,然後根據閾值進行過濾。但是,它需要進行全表掃描,對於大型資料集來說可能很慢。

方法二:依隨機值排序並限制結果

<code class="language-sql">select * from table order by random() limit 1000;</code>
登入後複製

此方法隨機對行進行排序,並選擇前n行。它的性能優於第一種方法,但它有一個限制:當行組中存在過多行時,它可能無法選擇隨機子集。

大型資料集的最佳化方案

對於具有大量行的表(例如您範例中的5億行),以下方法提供了一個最佳化的解決方案:

<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   big USING (id)
LIMIT  1000;                          -- 去除多余项</code>
登入後複製

此查詢利用ID列上的索引進行高效率檢索。它在ID空間內產生一系列隨機數,確保ID唯一,並將資料與主表連接以選擇所需數量的行。

其他考慮因素

邊界查詢:
表ID列的空隙相對較少至關重要,以避免在隨機數產生中需要大型緩衝區。

物化視圖:
如果需要重複調用隨機數據,考慮創建物化視圖可以提高效能。

PostgreSQL 9.5 的 TABLESAMPLE SYSTEM:
PostgreSQL 9.5 中引入的這種最佳化技術允許快速取樣指定百分比的行。

以上是如何從大型 PostgreSQL 表中有效地選擇隨機行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板