Эффективность максимального значения SELECT от dbtab
Какой самый эффективный и элегантный способ выбрать значение MAX из прозрачной таблицы? Например, попробуем выбрать такую простую таблицу, как T100, Messages. Давайте представим, что мы должны выбрать максимальный номер сообщения в некоторой области приложения. Мы можем сделать это несколькими способами.
Наиболее очевидным является использование MAX
агрегатная функция
select MAX(msgnr)
from t100
where arbgb = '/ASU/GENERAL'
А другой использует UP TO 1 ROWS
пункт
select msgnr
from t100
where arbgb = '/ASU/GENERAL'
and ROWNUM = 1
order by msgnr DESC
Здесь и далее все операторы SQL приведены в собственном Oracle SQL, как я делал тесты в DBACOCKPIT, где это обязательно.
Встроенный инструмент кабины показал почти идентичные результаты для обоих запросов:
- для обоих из них предполагаемые затраты равны 3, однако у второго запроса в плане всего 2 шага, а у первого - 3.
- оценочные затраты на ЦП для первого запроса составляют 21,564 за шаг, однако второй имеет общую стоимость 21,964.
Таким образом, мы можем заключить, что второй вариант здесь более эффективен.
Однако будет ли это точкой в общем случае? Будет ли этот результат отличаться на разных БД, или мы можем рассматривать его как практическое правило?
1 ответ
Измерения производительности всегда варьируются в зависимости от довольно большого набора параметров, причем СУБД не является последним из них. Например, некоторые СУБД могут использовать индекс для эффективного определения MAX(...)
В то время как другие, возможно, придется прибегнуть к какой-то более неэффективной форме. Кроме того, не доверяйте прогнозам оптимизатора - измеряйте реальную производительность. Оптимизатор может быть неправильным по ряду причин (насколько я знаю, устаревшая статистика и неработающие индексы являются наиболее распространенными), и это мало поможет, если оптимизатор оценивает общую стоимость в 12,345, если фактическая стоимость оказывается равной быть 987.654. Следовательно, мои рекомендации будут
- выберите только то, что вам нужно (избегайте
SELECT *
использоватьWHERE
толково) - измерить, измерить, измерить
- Будьте осторожны с большинством недоказанных и предполагаемых практических правил.