|
Случайная выборка
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
В таблице N записей (=10000000). Как сгенерировать случайную выборку из M записей? Желательно за разумное время. Первое, что приходит в голову, разыграть M чисел от 1 до N, и затем из полного скана выдернуть записи с этими номерами. Но это полный скан, и PSQL какой-никакой. Может, есть более элегантное решение? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:02 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Генерируй случайные числа, по возможности из реального диапазона id, и ищи их в таблице. Нашёл - возвращай, не нашёл - генери новое число. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:18 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Не. Реальный диапазон значений id - почти весь bigint, ну, чуток поменьше - 10^15. А записей всего 10^7. Долго искать попаданий придется. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:23 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Но это метод, да, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:26 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
можно так попробовать - 1. Получить COUNT 2. Сгенерировать M случайных чисел в диапазоне 1..COUNT 3. Сделать M запросов SELECT ... OFFSET N FETCH FIRST ROW ONLY ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:34 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
romangr, COUNT - это N. А так почти как у меня, только вместо одного полного скана запускаем M почти полных сканов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 21:42 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyanskyА записей всего 10^7. Долго искать попаданий придется. Тогда делай как в "что, где, почём": получай первую запись с id >= сгенерированного случайного числа. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 22:10 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, О! Это ценная идея. Только посмотреть надо бы, все ли там хорошо с равномерностью распределения. На первый взгляд вроде не должно быть искажений. Да и моя задача не требует идеальности. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2021, 22:21 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Тогда делай как в "что, где, почём": получай первую запись с id >= сгенерированного случайного числа. Тогда вероятность выдергивания записи перед которой много неиспользуемых ID будет выше чем скажем идущих подряд) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 09:52 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyansky Не. Реальный диапазон значений id - почти весь bigint, ну, чуток поменьше - 10^15. А записей всего 10^7. Долго искать попаданий придется. Если нет массовых удалений то добавить еще одно уникальное поле в таблицу, для существующих записей перенумеровать от 1 до .... в триггер на вставку генератор на это поле А далее как в 22312152 , только искать по новому полю ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 12:39 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
a7exander Тогда вероятность выдергивания записи перед которой много неиспользуемых ID будет выше чем скажем идущих подряд) Ага, это неприятность. Сформулирую так: если распределение id в своем пространстве равномерно-случайно, то данный метод тоже даст равновероятностную выборку. Но если существуют кучности и разреженности, то в выходном наборе элементы из кучностей будут представлены неоправданно редко, а элементы из разреженностей - неоправданно часто. Кстати, и в первом случае уже после первых "выемок" появятся неоднородности. Это хорошо как раз видно на примере волчка "Что, Где, Когда?". Поначалу, когда весь стол заполнен, вероятность выпадения всех вопросов одинакова. Но потом возникают лакуны, и вопросы на их правой границе имеют гораздо больший шанс попасть в игру. Если же практически, то мне для своей задачи метод вполне подходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 14:16 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyansky, меняй "направление волчка" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 14:53 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
WildSery, Очень мало поможет. Левые берега дырок тоже получат большие шансы, но и только. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 15:06 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
когда-то давно обсуждалось. можно поискать. если не ошибаюсь, решение свелось к SKIP(Random) + ORDER BY Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 15:44 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Мимопроходящий, оно ж будет сильно не оптимально, когда надо пропустиnь 100500 записей ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 17:02 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyansky, если свезет - один пробег, не свезет, тоо два Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 17:10 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
pastor, Это все равно полный скан, а то и не один, только используются не случайные позиции, а случайные дельты. Кстати, совершенно непонятно, и у вас не указано, из какого диапазона надо эти дельты разыгрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 17:41 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
pastor, Тогда уже лучше так Код: sql 1.
Тут хоть гарантировано 1 пробег ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 17:51 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyansky, добавь поле "Номер", и перед операцией заливай значения из генератора. Диапазон будет как раз о значения генератора до операции до значения после. На поле - индекс. Вот и будет тебе быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2021, 19:27 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Шавлюк Евгений pastor, Тогда уже лучше так Код: sql 1.
Тут хоть гарантировано 1 пробег на каждую запись. я же предложил полный скан (иногда больше), даже для случаев когда размер случайной выборки сравним с размером таблицы. когда у нас там full scan на 16k странице (200 байт на запись) выгоднее - при 1/80? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 08:52 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
ъъъъъ добавь поле "Номер" "Чтобы прочитать книгу, надо сперва дописать книгу" - это не наш метод. И потом, тут опять полный перебор, да еще и с записью. Обращаю ваше внимание, что существенная часть задачи состоит именно в избегании полного перебора записей, ибо с полным перебором (одним!) задача решается достаточно тривиально и математически правильно, как описано у меня в топике. Вот метод hvlad'а и дополнение Dimitry Sibiryakov'а как раз дают решение без полного скана. Больше пока не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 15:46 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
shalamyansky, Тогда мое предложение. Добавь в таблицу поле с хешем, который более-менее равномерно распределен по диапазону. Например md5(table_id). А далее первых М строк с хешем больше случайного ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:09 |
|
Случайная выборка
|
|||
---|---|---|---|
#18+
Шавлюк Евгений shalamyansky, Тогда мое предложение. Добавь в таблицу поле с хешем, который более-менее равномерно распределен по диапазону. Тогда можно еще проще - поле с Rand() вместо хеша, результат то тот же а распределение может даже лучше выйти ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:38 |
|
|
start [/forum/topic.php?fid=40&msg=40064702&tid=1560050]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
138ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 234ms |
total: | 482ms |
0 / 0 |