2011-08-25 3 views
25

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

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

ИЛИ

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

Я пошел бы с 2-й вариант, но я не знаю, почему, и если это так.

ответ

13

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

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

заказа результат требует дальнейшей переработки.

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

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

+1

SQL Server TOP 1 ведет себя иначе, чем Oracle, используя rowNum = 1. Oracle на самом деле захватывает первый, который он находит до заказа, поэтому этот метод действителен только для SQL Server. Еще одно преимущество этого TOP 1 против Max() заключается в том, что вы можете захватить столько столбцов, сколько хотите, до тех пор, пока вы включите соответствующий заказ. Я тестировал с помощью Max() и нашел даже с GROUP BY, что он, похоже, не дал всего 1 запись. Возможно, кто-то, как более сильный mojo, может сказать, как получить только одну строку, если вы хотите получить вершину из нескольких столбцов без подзапроса? – gordon

10

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

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

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

+2

o.O первый запрос по-прежнему будет возвращать одну запись –

+1

@Shredder При условии, что 'a_primary_key' на самом деле является первичным ключом, он будет. Но если это первичный ключ, у вас есть только одна дата в 'a_date', и вам не нужны ни' max', ни 'top'. – GSerg

+0

Даже если это не так, оно все равно вернет одну запись. http://www.w3schools.com/sql/sql_func_max.asp –

0

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

+1

Он не получит первое значение. 'Top', в сочетании с' order by asc', выберет наименьшее значение. – GSerg

+0

wth you smokin bro, gimme some of that .. It * будет * захватить первое найденное значение, и да, в этом случае он будет самым маленьким, так как заказ ASC переходит от самого маленького к самому большому, что делает первое значение наименьшим .. –

5

Для запросов, чтобы иметь тот же результат, что вам нужно будет:

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

Не нужно группировать в первом примере (потому что у вас есть только одна группа в соответствии с вашим предложением WHERE). – Chains

+0

@kuru: Я не уверен, что вы можете использовать агрегированную функцию w/oa group by, но если так ... вы правы – vol7ron

+3

Пока вы только выбираете aggs (как вы в своем ответе) ты в порядке. Если вы укажете в элементе значение, отличное от agg, то вам понадобится группа. – Chains

28

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

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

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

0

я выполняю макс и сверху на одном столе с 20,00,000+ записей, и обнаружили, что Лучшие дают быстрый результат с заказом на чем макс или мин функции.

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

Смежные вопросы