powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выбрать случайные 1000 строк из таблицы?
5 сообщений из 5, страница 1 из 1
Как выбрать случайные 1000 строк из таблицы?
    #40093958
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, привет.
Для анализа очень большой БД, потребовалось выбрать 1000 строк из каждой таблицы.
Таблиц много, в некоторых таблицах - десятки миллиардов записей.
Есть решение:
select * from table_name sample(1);
конструкция sample(1) - выберет случайные 1% записей из таблицы.
Чтобы вычислить процент, надо знать количество записей в таблице, а таблицы не проанализированы, user_tables.num_rows - имеют старые значения, или вообще не заполнены.
Какие есть способы решения?
Пока придумал только последовательный подбор значения процента от самого маленького допустимого значения (0.000001).
...
Рейтинг: 0 / 0
Как выбрать случайные 1000 строк из таблицы?
    #40093977
BRATISCHKA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select *
from
(select t.*,
       row_number () over (order by dbms_random.value) rn
from table_name t
)
where rn <= 1000



Может так? Правда боюсь представить сколько по времени это может занять
...
Рейтинг: 0 / 0
Как выбрать случайные 1000 строк из таблицы?
    #40093979
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shurka22,

раз посчитать к-во (ночью, на выходные, с мин. приоритетом и тд)


авторконструкция sample(1) - выберет случайные 1% записей из таблицы.

1% оракля от чего считает? от к-ва реальных строк, или от ...?

.....
stax
...
Рейтинг: 0 / 0
Как выбрать случайные 1000 строк из таблицы?
    #40093983
shurka22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax

1% оракля от чего считает? от к-ва реальных строк, или от ...?

Думаю, что именно "или от".
Несколько выполнений запроса
select count(*) from t sample(1); -- выборка количества 1% записей из таблицы
- и результат всегда разный, но отличается не более 10% от истинного значения. Допустимо для решения задачи.
...
Рейтинг: 0 / 0
Как выбрать случайные 1000 строк из таблицы?
    #40094013
Фотография shane54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 работал часы, дни или просто не дожидался завершения.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как выбрать случайные 1000 строк из таблицы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]