鉴于您的规格(以及评论中的其他信息),
您有一个数字ID列(整数),只有很少(或中等很少)的间隙。
显然没有或很少写操作。
您的ID列必须编入索引! 主键很好用。
下面的查询不需要对大表进行顺序扫描,只需要进行索引扫描。
首先,获取主要查询的估计值:
SELECT count(*) AS ct -- optional
, min(id) AS min_id
, max(id) AS max_id
, max(id) - min(id) AS id_span
FROM big;
唯一可能很昂贵的部分是BERNOULLI(适用于大型桌子)。 鉴于上述规格,您不需要它。 估计会很好,几乎没有任何费用(详细说明):
SELECT reltuples AS ct FROM pg_class WHERE oid = 'schema_name.big'::regclass;
只要BERNOULLI不比SYSTEM小很多,查询就会胜过其他方法。
WITH params AS (
SELECT 1 AS min_id -- minimum id <= current min id
, 5100000 AS id_span -- rounded up. (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)