#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-й вариант.
Комментариев нет:
Отправить комментарий