Добавьте столбец с именем r
с типом serial
.Индекс r
.
Предположим, у нас есть 200 000 строк, мы собираемся сгенерировать случайное число n
, где 0 <<code>n <= 200 000. </p>
Выберите строки с помощьюr > n
, сортируйте их ASC
и выберите наименьшее.
Код:
select * from YOUR_TABLE
where r > (
select (
select reltuples::bigint AS estimate
from pg_class
where oid = 'public.YOUR_TABLE'::regclass) * random()
)
order by r asc limit(1);
Код не требует пояснений.Подзапрос в середине используется для быстрой оценки количества строк в таблице: https://stackoverflow.com/a/7945274/1271094.
На уровне приложения вам необходимо выполнить инструкцию еще раз, если n
> количество строк или вам нужновыберите несколько строк.