2010-12-11 2 views
5

Какой из них лучше в SQL Server 2008, или это не имеет значения, поскольку база данных оптимизируется.SQL max строка таблицы

SELECT * FROM table 
WHERE datecolumn = (SELECT max(datecolumn) FROM table); 


SELECT TOP 1 * FROM table ORDER BY datecolumn DESC; 
+3

Они могут производить разные результаты. Верхний пример может возвращать более одной строки (в основном каждая строка соответствует самой большой дате). Нижний запрос возвращает только 1 строку (и ничего не делает о датах привязки) – Sparky

ответ

9

Рассматривая фактический план выполнения SQL для этих запросов, он дает точно такой же план выполнения и ту же стоимость исполнения. Однако это может различаться в зависимости от настройки индекса и собранной статистики, поэтому лучше всего проверить себя.

Одна вещь, о которой нужно знать, состоит в том, что два запроса могут не возвращать тот же результат. Второй SQL всегда будет возвращать одну запись, где первая запись может возвращать несколько строк, если datecolumn не уникален.

0

Вам нужно посмотреть план выполнения ответа.

0

SELECT * FROM table WHERE datecolumn = (SELECT max (datecolumn) FROM table);

SELECT TOP 1 * FROM table ORDER BY datecolumn DESC;

Эти запросы возвращают разницу в стоимости. из sql server выполните первый запрос. подпроцесс будет запускаться первым и сканировать кортежи в таблице и получить максимальный стол даты , после чего внешний запрос сканирует таблицу и ищет datcolumn = ..... таким образом, это не эффективность.

второй запрос более эффективен, потому что один раз сканирование кортежей таблицы происходит один раз.

для примечания: если датаканал является первичным ключом или столбцом индекса, это не является существенной разницей обоих запросов. но если этот столбец не является индексом и первичным ключом, он может значительно разниться в стоимости