Выберите " 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