V tabulce bez seskupeného indexu (tabulka haldy) nejsou datové stránky propojeny – takže procházení stránek vyžaduje vyhledejte mapu alokace indexu .
Klastrovaná tabulka má však své datové stránky propojené ve dvojitě propojeném seznamu - trochu rychlejší sekvenční skenování. Samozřejmě výměnou za to máte režii na udržování pořádku na datových stránkách na INSERT
, UPDATE
a DELETE
. Tabulka haldy však vyžaduje druhý zápis do IAM.
Pokud má váš dotaz hodnotu RANGE
operátor (např.:SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
), pak by byla seskupená tabulka (v zaručeném pořadí) efektivnější – protože by mohla používat indexové stránky k nalezení relevantních datových stránek. Hromada by musela skenovat všechny řádky, protože se nemůže spoléhat na objednávání.
A samozřejmě, seskupený index vám umožní provést CLUSTERED INDEX SEEK, což je z hlediska výkonu docela optimální...hromada bez indexů by vždy vedla ke skenování tabulky.
Takže:
-
U vašeho příkladu dotazu, kde vyberete všechny řádky, je jediným rozdílem dvojitě propojený seznam, který udržuje seskupený index. Díky tomu by měla být vaše seskupená tabulka jen o malý kousek rychlejší než halda s velkým počtem řádků.
-
Pro dotaz s
WHERE
klauzule, která může být (alespoň částečně) splněna seskupeným indexem, se dostanete dopředu kvůli řazení - takže nebudete muset skenovat celou tabulku. -
U dotazu, který není uspokojen seskupeným indexem, jste do značné míry vyrovnaní... opět, jediným rozdílem je ten dvojitě propojený seznam pro sekvenční skenování. V obou případech nejste optimální.
-
Pro
INSERT
,UPDATE
aDELETE
hromada může a nemusí vyhrát. Halda nemusí udržovat pořádek, ale vyžaduje druhý zápis do IAM. Myslím, že rozdíl v relativním výkonu by byl zanedbatelný, ale také dost závislý na datech.
Microsoft má bílou knihu který porovnává seskupený index s ekvivalentním neshlukovaným indexem na hromadě (není úplně stejný, jak jsem diskutoval výše, ale blízko). Jejich závěr je v podstatě umístit shlukovaný index na všechny tabulky. Udělám, co bude v mých silách, abych shrnul jejich výsledky (opět poznamenejme, že zde skutečně porovnávají neshlukovaný index se shlukovaným indexem – ale myslím, že je to relativně srovnatelné):
INSERT
výkon:seskupený index vyhraje asi o 3 % díky druhému zápisu potřebnému pro hromadu.UPDATE
výkon:seskupený index vyhraje asi o 8 % díky druhému vyhledávání potřebnému pro hromadu.DELETE
výkon:seskupený index vyhraje o přibližně 18 % díky druhému potřebnému vyhledávání a druhému potřebnému odstranění z IAM pro hromadu.- jeden
SELECT
výkon:seskupený index vyhraje asi o 16 % díky druhému vyhledávání potřebnému pro hromadu. - rozsah
SELECT
výkon:seskupený index vyhraje asi o 29 % díky náhodnému řazení pro hromadu. - současné
INSERT
:tabulka haldy vyhraje při zatížení o 30 % kvůli rozdělení stránek pro seskupený index.