MAX vs Top 1 - что лучше? - PullRequest
       1

MAX vs Top 1 - что лучше?

35 голосов
/ 26 августа 2011

Мне пришлось просмотреть какой-то код, и я наткнулся на что-то, что кто-то сделал, и не могу придумать причину, по которой мой путь лучше, а возможно и нет, поэтому, что лучше / безопаснее / эффективнее?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id

OR

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date

Я бы пошел со вторым вариантом, но я не уверен, почему, и если это правильно.

Ответы [ 6 ]

38 голосов
/ 29 января 2014

1) Когда есть кластеризованный индекс в таблице и столбце для запроса, оператор MAX() и запрос SELECT TOP 1 будут иметь почти одинаковую производительность.

2) Когда нет кластеризованного индекса в таблице и столбце, который нужно запросить, оператор MAX() обеспечивает лучшую производительность.

Ссылка: http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/

17 голосов
/ 26 августа 2011

Производительность обычно аналогична, если ваша таблица проиндексирована.

Стоит рассмотреть, хотя: Top обычно имеет смысл, только если вы упорядочиваете свои результаты (в противном случае, top из что ?)

Для заказа результата требуется больше обработки.

Мин не всегда требует заказа. (Просто зависит, но часто вам не нужно упорядочивать или группировать и т. Д.)

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

11 голосов
/ 26 августа 2011

Это разные запросы.

Первая возвращает много записей (самая большая a_date для каждой event_id, найденной в a_primary_key = 5)

Вторая возвращает одну запись (самая маленькая a_date найдена в a_primary_key = 5).

5 голосов
/ 26 августа 2011

Чтобы запросы имели одинаковый результат, вам потребуется:

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC

Лучший способ узнать, что быстрее, это проверить план запроса и выполнить свои тесты. На скорость влияют многие факторы, такие как размер таблицы / кучи и т. Д. И даже разные версии одной и той же базы данных могут быть оптимизированы для предпочтения одного запроса другому.

3 голосов
/ 28 августа 2014

Я выполняю макс и топ на одной таблице с 20 000 000+ записей, и обнаружил, что Top дает более быстрый результат с порядком, чем функция max или min.

Итак, лучший способ - выполнить оба запроса один за другим в течение некоторого времени и проверить истекшее время соединения для чем.

0 голосов
/ 26 августа 2011

MAX и TOP работают по-разному.Ваш первый запрос вернет максимальное найденное значение для a_date, для которого найдены a_primary_key = 5 для каждого различного найденного event_id.Второй запрос просто захватит первый a_date с a_primary_key = 5, найденным в наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...