Řazení podle id pravděpodobně používá skenování seskupeného indexu při objednávání podle datetime používá buď řazení, nebo vyhledávání v indexu.
Obě tyto metody jsou pomalejší než skenování seskupeného indexu.
Pokud je vaše tabulka seskupená podle id , v podstatě to znamená, že je již seřazeno. Záznamy jsou obsaženy v B+Tree který má propojený seznam propojující stránky v id objednat. Motor by měl pouze procházet propojený seznam, aby získal záznamy seřazené podle id .
Pokud id s byly vkládány v sekvenčním pořadí, to znamená, že fyzické pořadí řádků bude odpovídat logickému pořadí a skenování seskupeného indexu bude ještě rychlejší.
Pokud chcete, aby byly vaše záznamy seřazeny podle datetime , jsou dvě možnosti:
- Vezměte všechny záznamy z tabulky a seřaďte je. Pomalost je zřejmá.
- Používejte index v
datetime. Index je uložen v samostatném prostoru na disku, což znamená, že stroj musí přecházet mezi stránkami indexu a stránkami tabulky ve vnořené smyčce. Je také pomalejší.
Chcete-li zlepšit řazení, můžete vytvořit samostatný index pokrytí v datetime :
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
a zahrňte do tohoto indexu všechny sloupce, které používáte ve svém dotazu.
Tento index je jako stínová kopie vaší tabulky, ale s daty seřazenými v jiném pořadí.
To vám umožní zbavit se vyhledávání klíčů (protože index obsahuje všechna data), což způsobí řazení podle datetime stejně rychle jako na id .
Aktualizace:
Nový blogový příspěvek o tomto problému: