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