Ř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: