Заказ на id
, вероятно, использует сканирование с кластерным индексом, а порядок datetime
использует сортировку или поиск по индексу.
Оба эти метода являются более медленными, чем кластерное сканирование индекса.
Если ваш стол сгруппирован по id
, в основном это означает, что он уже отсортирован. Записи содержатся в файле B+Tree
, который имеет связанный список, связывающий страницы в заказе id
. Двигатель должен просто пересечь связанный список, чтобы получить записи, упорядоченные по id
.
Если id
s были вставлены в последовательном порядке, это означает, что физический порядок строк будет соответствовать логическому порядку, а сканирование кластерного индекса будет еще быстрее.
Если вы хотите, чтобы ваши записи будут отсортированы по datetime
, есть два варианта:
- Возьмите все записи из таблицы и сортировать их. Медленность очевидна.
- Используйте индекс на
datetime
. Индекс хранится в отдельном пространстве диска, это означает, что движок должен перемещаться между индексными страницами и страницами таблицы во вложенном цикле. Это медленнее.
Для улучшения заказа, вы можете создать отдельный индекс покрытия datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
, и включают в себя все столбцы, используемые в запросе в этот индекс.
Этот индекс похож на теневую копию таблицы, но с данными, отсортированными в другом порядке.
Это позволит избавиться от ключевых поисков (поскольку индекс содержит все данные), который будет делать упорядочение на datetime
так же быстро, как на id
.
Update:
Свежее сообщение в блоге на эту проблему:
В каких "РСУБД" вы используете? – Quassnoi
Я использую SQL Server 2008 – silent
- это то, что столбец datetime в отдельном индексе? Вы говорите «добавили .. к индексу» ....если столбец datetime является, например, столбец №. 3 в составном индексе, который вообще не поможет при попытке заказать этот столбец datetime ........ –