PostgreSQL隨機行選擇方法
處理包含數百萬甚至數十億筆記錄的大型表時,傳統的隨機行選擇方法效率低且速度緩慢。兩種常見方法分別是:
使用random()
過濾:
<code class="language-sql"> select * from table where random() < 0.001;</code>
使用order by random()
和limit
:
<code class="language-sql"> select * from table order by random() limit 1000;</code>
然而,由於需要全表掃描或排序,這些方法對於行數較多的表並非最佳選擇,會導致效能瓶頸。
大型表的最佳化方法
對於以下類型的表,請考慮以下最佳化方法,其速度明顯更快:
查詢:
<code class="language-sql">WITH params AS ( SELECT 1 AS min_id, -- 可选:自定义最小ID起始值 5100000 AS id_span -- 近似ID范围(最大ID - 最小ID + 缓冲) ) SELECT * FROM ( SELECT DISTINCT 1 + trunc(random() * p.id_span)::integer AS id FROM params p, generate_series(1, 1100) g GROUP BY 1 ) r INNER JOIN big ON r.id = big.id LIMIT 1000;</code>
工作原理:
ID範圍估計:
隨機ID產生:
冗餘與重複消除:
表格連接與限制:
為什麼它速度快:
最小的索引使用:
最佳化的隨機數產生:
冗餘與重複消除:
其他選項:
處理間隙的遞迴CTE:
函數包裝器以供重複使用:
任何表格的通用函數:
物化視野以提高速度:
PostgreSQL 9.5中的TABLE SAMPLE
:
TABLE SAMPLE SYSTEM
」功能,實現更快但隨機性較低的行取樣方法,確保傳回精確的行數。但是,請記住,由於聚集效應,樣本可能不是完全隨機的。 以上是如何從大型 PostgreSQL 表中有效地選擇隨機行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!