Postgresql: случайный и рассчитывать в одном запросе - PullRequest
0 голосов
/ 17 ноября 2011

Я использую Postgresql 9.1. У меня есть таблица, и я хотел бы сделать две вещи в одном запросе:

Первый: выберите одну строку случайной выборки:

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

Второе: подсчитать количество строк, из которых был выбран образец:

select count(1) from table;

Поскольку надлежащая функция random () должна знать обо всех строках, мне интересно, есть ли способ получить оба результата в одном запросе.

Я предполагаю, что-то ссылка:

select count(1), first.* from table order by random();

но я действительно не знаю, как это сделать.

Итак, я хочу случайную строку и общее количество строк.

Спасибо за любые идеи.

Steve

1 Ответ

2 голосов
/ 17 ноября 2011

Один из способов сделать это:

SELECT *, (SELECT count(*) FROM tbl) AS ct
FROM   tbl
ORDER  BY random()
LIMIT  1;

Если таблица огромна, а производительность - проблема, есть способы ускорить случайный выбор. Наличие последовательного столбца без пробелов очень поможет в этом ...

Если это для вас, взгляните на этот связанный ответ: Случайная строка в MySQL
Работает и в PostgreSQL. Замените random() на rand().

.

Кстати, функция random() работает абсолютно независимо от количества строк.


Вот вариант, который производит то же самое только с одним последовательным сканированием:

SELECT *, count(*) OVER () AS ct
FROM   ef.adr
ORDER  BY random()
LIMIT  1;

Однако быстрый тест с таблицей из 5 тыс. Строк был медленнее.
Еще один с таблицей из 400 тысяч строк показывает аналогичный результат. немного медленнее. Оконные функции могут влиять на производительность. И считается, что count (*) довольно медленный для больших таблиц в PostgreSQL, потому что каждый кортеж должен быть посещен.

Сканирование только по индексу («покрывающие индексы») недавно было реализовано в версии 9.2 devel. Таким образом, мы ожидаем ускорения со следующей версией здесь. Подробнее об этом можно прочитать в сообщении на dba.stackexchange.com :

Между тем, 230 мс для таблицы 400 Кб не так уж и плохи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...