Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Каква е разликата между сканиране на таблица и сканиране на клъстерен индекс?

В таблица без клъстерен индекс (таблица с купчина) страниците с данни не са свързани помежду си - така че преминаването на страници изисква търсене в картата за разпределение на индекс .

Клъстерираната таблица обаче има своите страници с данни, свързани в двойно свързан списък - правене на последователни сканирания малко по-бързи. Разбира се, в замяна имате режийните разходи за поддържане на страниците с данни в ред на INSERT , UPDATE и DELETE . Въпреки това, таблицата с купчина изисква втори запис в IAM.

Ако вашата заявка има RANGE оператор (напр.:SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 ), тогава една клъстерирана таблица (която е в гарантиран ред) би била по-ефективна - тъй като може да използва индексните страници, за да намери съответната страница(и) с данни. Купчината ще трябва да сканира всички редове, тъй като не може да разчита на подреждане.

И, разбира се, клъстериран индекс ви позволява да правите КЛУСТЕРИРАНО ТЪРСЕНЕ НА ИНДЕКС, което е доста оптимално за производителност...купчина без индекси винаги ще доведе до сканиране на таблица.

И така:

  • За вашата примерна заявка, при която избирате всички редове, единствената разлика е двойно свързаният списък, поддържан от клъстерен индекс. Това би трябвало да направи вашата клъстерирана таблица малко по-бърза от купчина с голям брой редове.

  • За заявка с WHERE клауза, която може да бъде (поне частично) удовлетворена от клъстерирания индекс, ще излезете напред поради подреждането - така че няма да се налага да сканирате цялата таблица.

  • За заявка, която не е удовлетворена от клъстерирания индекс, вие сте почти изравнени... отново, единствената разлика е този двойно свързан списък за последователно сканиране. И в двата случая не сте оптимален.

  • За INSERT , UPDATE и DELETE купчина може или не може да спечели. Купчината не трябва да поддържа ред, но изисква втори запис в IAM. Мисля, че относителната разлика в производителността би била незначителна, но също така доста зависима от данните.

Microsoft има бяла книга който сравнява клъстерен индекс с еквивалентен не-клъстерен индекс на купчина (не точно същото, както обсъдих по-горе, но близко). Техният извод е основно да се постави клъстерен индекс на всички таблици. Ще направя всичко по силите си, за да обобщя техните резултати (отново имайте предвид, че те наистина сравняват неклъстерен индекс с клъстерен индекс тук - но мисля, че е относително сравним):

  • INSERT производителност:клъстерният индекс печели с около 3% поради второто записване, необходимо за купчина.
  • UPDATE производителност:клъстерният индекс печели с около 8% поради второто търсене, необходимо за купчина.
  • DELETE производителност:клъстерният индекс печели с около 18% поради необходимостта от второ търсене и второто изтриване, необходимо от IAM за куп.
  • единичен SELECT производителност:клъстерният индекс печели с около 16% поради второто търсене, необходимо за купчина.
  • обхват SELECT производителност:клъстерираният индекс печели с около 29% поради произволното подреждане за куп.
  • едновременно INSERT :heap таблицата печели с 30% при натоварване поради разделяне на страници за клъстерирания индекс.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Персонализирани низове за формат на дата/час, поддържани от FORMAT() в SQL Server

  2. Има ли някакъв начин/инструмент за идентифициране на прогнозното време за изпълнение на заявката в SQL sERVER

  3. Намиране на дублиращи се редове в SQL Server

  4. Преименуване на множество таблици

  5. Нечетен INNER JOIN синтаксис и капсулиране