#sql #oracle #запрос #oracle12c
Как можно наиболее эффективно выбрать максимальное значение. Пока созрело 3 варианта:
1 - Классика
select max(log_id) from log where param = 16
2 - Извращения
select log_id from log where param = 16 order by log_id desc nulls last fetch next
1 rows only
3 - Аналитика
select v from
(
select max(log_id) over () v from log where param = 16
)
where rownum = 1
Судя по планам запросов в моей среде БД самый эффективный - последний. Может есть
варианты еще более эффективные?
Ответы
Ответ 1
А вы уверены, что это является узким местом в вашей БД? Или вы пытаетесь выполнить преждевременную оптимизацию до появления самой проблемы? Преждевременная оптимизация-корень всех бед Имхо, первый вариант с учетом того, что существует индекс по param должен отрабатывать моментально. На сколько я знаю, то индекс по полю по которому считается MAX тоже должен ускорить выборку, так как данные будут заранее отсортированы. +БД должна кешировать данные=> повторное выполнение запроса с другими параметрами должно отработать еще быстрее за счет того, что все данные были ранее вычитаны и загружены в ОЗУ. Если разница между этими 3 решениями и есть, то это какие-то считанные мс, которые не стоят уродства кода.Ответ 2
Если у вас может быть более одной записи с param = 16, то 3-й вариант может вернуть неправильный результат, потому что предикат rownum = 1 отработает до max(log_id). Поэтому я бы выбрал 1-й вариант.
Комментариев нет:
Отправить комментарий