Почему выбор max (поля) из таблицы работает так быстро по сравнению с выбором min (поля) из таблицы, Oracle 9i - PullRequest
4 голосов
/ 06 июня 2011

Я столкнулся с возможностью выполнения оператора select max в Oracle 9i, и он работал очень быстро.

select max(id) from audit_log; 

select min(id) from audit_log;

Однако при выполнении команды select min запрос кажется зависшим и никогда не возвращается.Эта таблица содержит журналы аудита и несколько сотен миллионов записей.

Объяснение плана для избранных мин.

Объяснение плана для избранных макс.

Ответы [ 2 ]

1 голос
/ 07 июня 2011

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

Возможно, вы столкнулись с проблемами блокировки.Попробуйте изменить уровень изоляции, чтобы понять, имеет ли это значение.

Возможно, ваш индекс поврежден.Попробуйте восстановить его.

1 голос
/ 06 июня 2011

Одной из возможных причин может быть то, что идентификатор столбца имеет индекс, но может быть нулевым . В этом случае строки с идентификатором null не будут в индексе . Следовательно, min () не может использовать индекс для обнуляемого столбца.

... так что скорее всего вам просто нужно alter table audit_log modify id not null;

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

...