Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Эффективный способ выбрать максимум

#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-й вариант.

Комментариев нет:

Отправить комментарий