Упорядочение по id
, вероятно, использует сканирование кластерного индекса, тогда как при упорядочении по datetime
используется либо сортировка, либо поиск по индексу.
Оба эти метода работают медленнее, чем сканирование кластерного индекса.
Если ваша таблица сгруппирована по id
, это означает, что она уже отсортирована. Записи содержатся в B+Tree
, который имеет связанный список, связывающий страницы в порядке id
. Движок должен просто пройти по связанному списку, чтобы получить записи, упорядоченные по id
.
Если id
были вставлены в последовательном порядке, это означает, что физический порядок строк будет соответствовать логическому порядку, и сканирование кластеризованного индекса будет еще быстрее.
Если вы хотите, чтобы ваши записи были заказаны по datetime
, есть два варианта:
- Взять все записи из таблицы и отсортировать их. Медлительность очевидна.
- Используйте индекс на
datetime
. Индекс хранится в отдельном пространстве диска, это означает, что движок должен переключаться между страницами индекса и страницами таблицы во вложенном цикле. Это тоже медленнее.
Чтобы улучшить порядок, вы можете создать отдельный индекс покрытия для datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
и включите в этот индекс все столбцы, которые вы используете в своем запросе.
Этот индекс похож на теневую копию вашей таблицы, но данные отсортированы в другом порядке.
Это позволит избавиться от поиска по ключевым словам (поскольку индекс содержит все данные), что позволит упорядочить на datetime
так же быстро, как и на id
.
Обновление:
Свежий пост в блоге по этой проблеме: