|
Как выбрать случайные 1000 строк из таблицы?
|
|||
---|---|---|---|
#18+
Коллеги, привет. Для анализа очень большой БД, потребовалось выбрать 1000 строк из каждой таблицы. Таблиц много, в некоторых таблицах - десятки миллиардов записей. Есть решение: select * from table_name sample(1); конструкция sample(1) - выберет случайные 1% записей из таблицы. Чтобы вычислить процент, надо знать количество записей в таблице, а таблицы не проанализированы, user_tables.num_rows - имеют старые значения, или вообще не заполнены. Какие есть способы решения? Пока придумал только последовательный подбор значения процента от самого маленького допустимого значения (0.000001). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2021, 07:31 |
|
Как выбрать случайные 1000 строк из таблицы?
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7.
Может так? Правда боюсь представить сколько по времени это может занять ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2021, 09:07 |
|
Как выбрать случайные 1000 строк из таблицы?
|
|||
---|---|---|---|
#18+
shurka22, раз посчитать к-во (ночью, на выходные, с мин. приоритетом и тд) авторконструкция sample(1) - выберет случайные 1% записей из таблицы. 1% оракля от чего считает? от к-ва реальных строк, или от ...? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2021, 09:15 |
|
Как выбрать случайные 1000 строк из таблицы?
|
|||
---|---|---|---|
#18+
Stax 1% оракля от чего считает? от к-ва реальных строк, или от ...? Думаю, что именно "или от". Несколько выполнений запроса select count(*) from t sample(1); -- выборка количества 1% записей из таблицы - и результат всегда разный, но отличается не более 10% от истинного значения. Допустимо для решения задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2021, 09:33 |
|
Как выбрать случайные 1000 строк из таблицы?
|
|||
---|---|---|---|
#18+
shurka22 select count(*) from t sample(1); -- выборка количества 1% записей из таблицы - и результат всегда разный Ну так и должно быть, чтобы SAMPLE(n) возвращал одно и то же значение при каждом выполнении, нужно использовать SEED(m), где m - число (постоянное, от запроса к запросу) от 0 до 4294967295. Также SAMPLE может работать в двух режимах - в строчном (row, режим по-умолчанию), и в блочном, тогда нужно использовать SAMPLE BLOCK(n). Кстати, блочный SAMPLE может не захотеть работать, ему нужен full scan - если есть более эффективный план чем full scan, Оракл выберет его и SAMPLE будет выполнен в режиме row. Так что нужен хинт FULL или INDEX_FFS. В общем, чего документацию пересказывать - там все это есть: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6 И пара блогов по теме от людей - от работника Oracle: https://blogs.oracle.com/machinelearning/to-sample-or-not-to-sample-part-2 И от Льюиса, как всегда - глубоко, с объяснением, "как это работает": https://jonathanlewis.wordpress.com/2010/03/12/sample-clause/ Кстати, я когда-то давно именно такую задачу решал, и SAMPLE действительно мгновенно позволял прикинуть, сколько строк в таблице. В то время как COUNT работал часы, дни или просто не дожидался завершения. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2021, 11:01 |
|
|
start [/forum/moderation_log.php?user_name=Dajrone]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 440ms |
total: | 582ms |
0 / 0 |