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

Трябва ли да индексирам битово поле в SQL Server?

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

Когато поискате набор от редове, SQL използва индекса, за да намери редовете по-бързо от сканирането на таблицата (преглеждайки всеки ред).

SQL има клъстерирани и неклъстерни индекси. Моето разбиране за клъстерираните индекси е, че те групират подобни стойности на индекси в една и съща страница. По този начин, когато поискате всички редове, съответстващи на стойност на индекс, SQL може да върне тези редове от клъстерирана страница от паметта. Ето защо опитът за клъстерно индексиране на колона GUID е лоша идея – не се опитвате да групирате произволни стойности.

Когато индексирате колона с цяло число, индексът на SQL съдържа набор от редове за всяка стойност на индекса. Ако имате диапазон от 1 до 10, тогава ще имате 10 индексни указатели. В зависимост от това колко реда има, това може да се страници по различен начин. Ако вашата заявка търси индекса, съответстващ на "1" и след това където Name съдържа "Fred" (ако приемем, че колоната Name не е индексирана), SQL получава набора от редове, съответстващи на "1", много бързо, след което таблицата сканира, за да намери останалите.

Така че това, което SQL наистина прави, е да се опитва да намали работния набор (брой редове), който трябва да повтори.

Когато индексирате битово поле (или някакъв тесен диапазон), вие намалявате само работния набор с броя на редовете, съответстващи на тази стойност. Ако имате малък брой съвпадащи редове, това би намалило много работния ви набор. За голям брой редове с разпределение 50/50 това може да ви купи много малко увеличение на производителността в сравнение с поддържането на индекса актуален.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вътрешни елементи за репликация на транзакции на SQL сървър – част 2

  2. Върнете основния тип данни от стойност на SQL_Variant в SQL Server

  3. 7645 Нулев или празен предикат на пълен текст

  4. Как да видите плана за изпълнение на заявка в Azure Data Studio (SQL Server)

  5. Ограничение по подразбиране на SQL за вмъкване на колона със стойност по подразбиране в таблицата на SQL Server