Подреждане по id
вероятно използва сканиране на клъстерен индекс, докато подрежда по datetime
използва сортиране или търсене в индекс.
И двата метода са по-бавни от сканирането на клъстерен индекс.
Ако вашата таблица е групирана по id
, основно това означава, че вече е сортиран. Записите се съдържат в B+Tree
който има свързан списък, свързващ страниците в id
поръчка. Машината трябва просто да премине през свързания списък, за да получи записите, подредени по id
.
Ако id
са били вмъкнати в последователен ред, това означава, че физическият ред на редовете ще съответства на логическия ред и сканирането на клъстерния индекс ще бъде още по-бързо.
Ако искате вашите записи да бъдат подредени по datetime
, има две опции:
- Вземете всички записи от таблицата и ги сортирайте. Бавността е очевидна.
- Използвайте индекса на
datetime
. Индексът се съхранява в отделно пространство на диска, което означава, че машината трябва да се движи между страниците на индекса и страниците на таблицата във вложен цикъл. Освен това е по-бавно.
За да подобрите подреждането, можете да създадете отделен покриващ индекс на datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
и включете всички колони, които използвате в заявката си, в този индекс.
Този индекс е като скрито копие на вашата таблица, но с данни, сортирани в различен ред.
Това ще позволи да се отървете от ключовите търсения (тъй като индексът съдържа всички данни), което ще направи подреждане по datetime
толкова бързо, колкото това на id
.
Актуализация:
Нова публикация в блог за този проблем: