Лучший способ выбрать случайные строки PostgreSQL - PullRequest
286 голосов
/ 30 декабря 2011

Я хочу случайный выбор строк в PostgreSQL, я попробовал это:

select * from table where random() < 0.01;

Но некоторые другие рекомендуют это:

select * from table order by random() limit 1000;

У меня очень большая таблица с 500 миллионами строк, я хочу, чтобы она была быстрой.

Какой подход лучше? Какие есть отличия? Каков наилучший способ выбора случайных строк?

Ответы [ 12 ]

0 голосов
/ 08 марта 2018

Я знаю, что немного опоздал на вечеринку, но я только что нашел этот удивительный инструмент, который называется pg_sample :

pg_sample - извлечь небольшой набор образцов данныхиз большой базы данных PostgreSQL при сохранении ссылочной целостности.

Я пробовал это с базой данных 350M строк, и это было действительно быстро, не знаю о случайности .

./pg_sample --limit="small_table = *" --limit="large_table = 100000" -U postgres source_db | psql -U postgres target_db
0 голосов
/ 11 декабря 2015

Добавьте столбец с именем 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> количество строк или вам нужновыберите несколько строк.

...