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中文网其他相关文章!