sql >> Databáze >  >> RDS >> Sqlserver

Jaký je rozdíl mezi prohledáváním tabulky a skenováním seskupených indexů?

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 a DELETE 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.


  1. SQL Server – Záleží na pořadí sloupců?

  2. selectbox s více sloupci z databáze mysql

  3. Hromadné vkládání s textovým kvalifikátorem na SQL Server

  4. Nesprávná hodnota DateTime '0000-00-00 00:00:00' - Date_Sub() v Having