#sql #oracle #postgresql
#sql #Oracle #postgresql
Вопрос:
Я пытаюсь ускорить запрос случайного выбора в Oracle и нашел этот блог. Я не могу преобразовать их следующие запросы Postgres в oracle:
select * from users
where
random() < 200 / (select count(1) from logs)::float
order by random()
limit 100;
и
select * from users
where id in (
select round(random() * 21e6)::integer as id
from generate_series(1, 110)
group by id -- Discard duplicates
)
limit 100;
Как будут выглядеть эти запросы в oracle?
Комментарии:
1. Оба поддерживают
FETCH FIRST
вместоLIMIT
. И я полагаюCAST
, вместо::
.2. Не могли бы вы опубликовать свой текущий запрос oracle
3. Как насчет использования
tablesample
для выборки строк из таблицы?4. @a_horse_with_no_name: Я знаю, что существует много способов (и много сообщений) о том, как использовать собственные методы выборки oracle. Мне интересно сравнить их с двумя приведенными выше запросами с точки зрения производительности, поэтому сначала мне нужно записать их в oracle.
Ответ №1:
Вы можете использовать такие запросы :
select * from
(
select u.*, row_number() over (order by dbms_random.value) as rn
from users u
where
dbms_random.value < 200 / (select count(1) from logs)
)
where rn <= 100;
и
select * from
(
select u.*, row_number() over (order by 1) as rn
from users u
where id in (
select round(dbms_random.value * 21e6) as id
from dual
connect by level <= 110
)
)
where rn <= 100;
Если версия вашей базы данных Oracle 12c, вы можете заменить where rn <= 100
части fetch first 100 rows only
столбцами и удалить rn
(которые состоят из row_number()
функций) в подзапросах.
Комментарии:
1. Я не понимаю из исходного сообщения в блоге и из вашего ответа, что находится
logs
в первом запросе, я подумал о какой-то конкретной вещи Postgres..2. @giotto Я думаю, что это не специфичные для платформы структуры, такие как представления словаря, а обычные таблицы, созданные пользователем.
3. Есть какие-либо подсказки о том, почему я получаю
SQL Error [904] [42000]: ORA-00904: "ID": invalid identifier
сообщение об ошибке при выполнении второго запроса?4. @giotto кажется, у вас нет такого столбца
ID
вusers
таблице. Вы можете переименовать в подзапросе имя, которое является столбцом этой таблицы.