Преобразование запросов postgres sql в oracle

#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 таблице. Вы можете переименовать в подзапросе имя, которое является столбцом этой таблицы.