Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy powinienem indeksować pole bitowe w SQL Server?

Zastanów się, czym jest indeks w SQL - a indeks jest tak naprawdę fragmentem pamięci wskazującym na inne fragmenty pamięci (tj. wskaźniki do wierszy). Indeks jest podzielony na strony, dzięki czemu części indeksu mogą być ładowane i usuwane z pamięci w zależności od użycia.

Kiedy pytasz o zestaw wierszy, SQL używa indeksu, aby znaleźć wiersze szybciej niż skanowanie tabeli (patrząc na każdy wiersz).

SQL ma indeksy klastrowe i nieklastrowe. Moje rozumienie indeksów klastrowych polega na tym, że grupują podobne wartości indeksów na tej samej stronie. W ten sposób, gdy poprosisz o wszystkie wiersze pasujące do wartości indeksu, SQL może zwrócić te wiersze z klastrowanej strony pamięci. Dlatego próba klastrowania indeksu kolumny GUID jest złym pomysłem - nie próbujesz grupować losowych wartości.

Kiedy indeksujesz kolumnę liczb całkowitych, indeks SQL zawiera zestaw wierszy dla każdej wartości indeksu. Jeśli masz zakres od 1 do 10, będziesz miał 10 wskaźników indeksu. W zależności od liczby wierszy może to być różnie stronicowane. Jeśli zapytanie szuka indeksu pasującego do „1”, a następnie gdy Nazwa zawiera „Fred” (zakładając, że kolumna Nazwa nie jest indeksowana), SQL bardzo szybko pobiera zestaw wierszy pasujących do „1”, a następnie skanuje tabelę, aby znaleźć resztę.

Tak więc to, co naprawdę robi SQL, to próba zmniejszenia zestawu roboczego (liczby wierszy), po którym musi iterować.

Kiedy indeksujesz pole bitowe (lub jakiś wąski zakres), redukujesz tylko zbiór roboczy o liczbę wierszy pasujących do tej wartości. Jeśli masz małą liczbę pasujących wierszy, znacznie zmniejszy to zestaw roboczy. W przypadku dużej liczby wierszy z rozkładem 50/50 może to przynieść bardzo niewielki wzrost wydajności w porównaniu z aktualizacją indeksu.

Powodem, dla którego wszyscy mówią o testowaniu, jest to, że SQL zawiera bardzo sprytny i złożony optymalizator, który może zignorować indeks, jeśli uzna, że ​​skanowanie tabel jest szybsze, może używać sortowania lub może organizować strony pamięci w dowolny sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sekwencja jako wartość domyślna dla kolumny

  2. Funkcja COALESCE w TSQL

  3. Microsoft SQL Server 2005/2008:XML a typ danych tekst/varchar

  4. Wyzwalacze programu SQL Server:wyzwalacze DML

  5. Jak zwrócić liczbę wierszy w wyniku zapytania w SQL Server