Использование ORDER BY в индексированных столбцах - PullRequest
2 голосов
/ 12 ноября 2010

В SQL Server 2008, скажем, у меня есть индекс (LastName, FirstName) для таблицы «Сотрудники».Индекс сортируется ASC по обоим столбцам.Есть ли смысл в ORDER BY в следующем запросе?

SELECT   LastName, FirstName
FROM     Employees
ORDER BY LastName, FirstName

Достаточно ли умен анализатор запросов, чтобы опустить ORDER BY, поскольку данные уже упорядочены по индексам?Или безопаснее всегда указывать желаемый порядок?

Ps.Я не пытаюсь углубиться в «микрооптимизации» - просто лучше понять, что происходит в этом сценарии.

Подробнее:

Для проверки теорииЯ случайно добавил некоторые данные, создал запрос, в котором пропущен ORDER BY, и результаты были упорядочены.

Ответы [ 3 ]

6 голосов
/ 12 ноября 2010

НЕТ , вы не можете опустить заказ на.

Нет гарантии порядка, в котором возвращаются записи, если он не был специально заказан.

Естьпосмотрите

Порядок набора результатов оператора SELECT для кластеризованной индексированной таблицы, когда ORDER BY не используется

1 голос
/ 12 ноября 2010

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

Create view foobar 
as 
select top 100 percent * from foo order by bar 

select * from foobar 

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

1 голос
/ 12 ноября 2010

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

...