Выберите " n " последние вставленные записи в таблице-oracle

таблица имеет суррогатный первичный ключ, генерируемый из последовательности. К сожалению, эта последовательность используется для генерации ключей для некоторых других таблиц (я не разрабатывал ее и не могу изменить).

каков самый быстрый способ выбрать last n вставленные записи в Oracle, упорядоченные по id в порядке убывания (последний вставлен сверху)?

n некоторое относительно небольшое число-количество записей для отображения на странице-вероятно, не больше, чем 50.

таблица теперь имеет 30.000.000 записей с 10-15 тысячами новых записей ежедневно.

5 ответов


использовать ROWNUM:

select
  *
from
  (
    select
      *
    from
      foo
    order by
      bork
   ) x
where
  ROWNUM <= n

отметим, что rownum применяется до сортировка для подзапроса, поэтому вам нужны два вложенных запроса, иначе вы просто получите n случайных строк.


будет ли он просматриваться много раз, чем он обновляется? Как насчет сохранения другой таблицы идентификаторов последних N вставленных строк (используйте триггер, чтобы удалить наименьший идентификатор из этой таблицы и добавить новую строку с текущим вставленным).

теперь у вас есть таблица, которая записывает идентификаторы в последние n строк. В любое время, когда вы хотите N, просто присоедините его к главной таблице. Если N изменяется, выберите максимальное значение, а затем отфильтруйте его после... конечно, вы можете найти его не так быстро для app (обслуживание этой таблицы может свести на нет любой прирост производительности)


в случаях, когда у вас нет строго возрастающем поле, вы также можете использовать ORA_ROWSCN (номер изменения системы) как приближение этого.

select * from (select * from student order by ORA_ROWSCN desc) where rownum<10

внимание: это не точно, так как Oracle записывает только один SCN на блок, а не на строку. Также кажется, что он делает полное сканирование таблицы-вероятно, oracle недостаточно умен, чтобы оптимизировать этот вид. Так что это может быть не очень хорошая идея для производства.


Это может помочь вам, если вы не знаете имя поля или что-нибудь кроме имени таблицы....

select * from (
  select * from(
    select rownum r,student.* from student where rownum<=(
      select max(rownum) from student
    )
  ) order by r desc
 ) where r<=10;

попробуйте сделать подсказку index_desc

select /*+ index_desc(MyTable,<PK_index>) */ * from MyTable order by primarykeyfield desc