Используйте в своих интересах ВИД и ПРЕДЕЛ, как Вы были бы с разбиением на страницы. Если Вы хотите ith блок строк, используйте СМЕЩЕНИЕ.
SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;
В ответ на Nir: операция вида не обязательно оштрафована, это зависит от того, что делает планировщик запроса. Так как этот вариант использования крайне важен для выполнения разбиения на страницы, существует некоторая оптимизация (см. ссылку выше). Это верно в пост-ГРЭС также "ORDER BY... ПРЕДЕЛ может быть сделан, не сортируя" E.7.1. Последний маркер
explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | items | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
Вы можете сделать что-то вроде этого:
create or replace trigger my_trigger
before update on my_table
for each row
declare
n_cols integer := 0;
begin
for r in (select column_name from all_tab_columns
where table_name = 'MY_TABLE'
and owner = 'MY_SCHEMA')
loop
if updating(r.column_name) then
n_cols := n_cols + 1;
exit when n_cols > 1;
end if;
end loop;
if n_cols > 1 then
do_something;
end if;
end;
Хотя, наверное, не очень эффективно!
Я не думаю, что есть способ избежать необходимости перечислять все другие столбцы в таблице либо в теле триггера, либо в перед обновлением .. .
Однако вы можете записать в таблицу триггер изменения для автоматического восстановления триггера обновления при добавлении или удалении каких-либо столбцов. Это немного больше работы, но тогда обслуживание должно быть автоматическим.
Вероятно, это не тот ответ, который вы хотите услышать, но я думаю, что вы слишком преувеличиваете бремя обслуживания. Очень часто структура таблицы после запуска в производство не является нормальным явлением. Если у вас есть таблица, в которой часто меняются номера или имена столбцов, то я бы посоветовал вам столкнуться с более серьезной архитектурной проблемой.
Итак, просто введите все имена столбцов сейчас и подождите, чтобы проверить, выполняется ли обслуживание. становится проблемой. Конечно, не стоит кодировать сложную реализацию в триггере - налог, который вы будете платить за каждое обновление, - чтобы избежать случайных изменений в сценарии DDL.