SQLShack (Polski)
Indeksy służą do przyspieszenia procesu zapytań w SQL Server, co skutkuje wysokim wydajność. Są podobne do indeksów podręczników. W podręcznikach, jeśli chcesz przejść do konkretnego rozdziału, przechodzisz do indeksu, znajdujesz numer strony rozdziału i przechodzisz bezpośrednio do tej strony. Bez indeksów proces znajdowania żądanego rozdziału byłby bardzo powolny.
To samo dotyczy indeksów w bazach danych. Bez indeksów DBMS musi przejrzeć wszystkie rekordy w tabeli, aby pobrać żądane wyniki. Ten proces nazywa się skanowaniem tabel i jest niezwykle powolny. Z drugiej strony, jeśli utworzysz indeksy, baza danych najpierw przechodzi do tego indeksu, a następnie bezpośrednio pobiera odpowiednie rekordy tabeli.
Istnieją dwa typy indeksów w SQL Server:
- Indeks klastrowy
- Indeks nieklastrowy
Indeks klastrowy
Indeks klastrowy definiuje kolejność, w jakiej dane są fizycznie przechowywane w tabeli. Dane tabeli można sortować tylko w sposób, dlatego w każdej tabeli może istnieć tylko jeden indeks klastrowy. W SQL Server ograniczenie klucza podstawowego automatycznie tworzy indeks klastrowy w tej konkretnej kolumnie.
Przyjrzyjmy się temu. Najpierw utwórz tabelę „uczniów” w „schooldb”, wykonując następujący skrypt, lub upewnij się, że Twoja baza danych jest w pełni zarchiwizowana, jeśli używasz danych na żywo:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
UTWÓRZ BAZĘ DANYCH schooldb
CREATE TABLE student
(
id INT PRIMARY KEY,
name VARCHAR (50) NOT NULL,
płeć VARCHAR (50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
city VARCHAR (50) NOT NULL
)
|
Uwaga tutaj w tabeli „ucznia” ustawiliśmy prima ry ograniczenie klucza w kolumnie „id”. Spowoduje to automatyczne utworzenie klastrowanego indeksu w kolumnie „id”. Aby wyświetlić wszystkie indeksy w określonej tabeli, wykonaj procedurę składowaną „sp_helpindex”. Ta procedura składowana akceptuje nazwę tabeli jako parametr i pobiera wszystkie indeksy tabeli. Następujące zapytanie pobiera indeksy utworzone w tabeli ucznia.
1
2
3
4
5
|
UŻYJ schooldb
EXECUTE sp_helpindex student
|
Powyższe zapytanie zwróci następujący wynik:
nazwa_indeksu | index_description | index_keys |
PK__student__3213E83F7F60ED59 | klastrowy, unikalny klucz podstawowy zlokalizowany na PRIMARY | id |
W wynikach widać tylko jeden indeks. To jest indeks, który został utworzony automatycznie z powodu ograniczenia klucza podstawowego w kolumnie „id”.
Ten indeks klastrowy przechowuje rekord w tabeli uczniów w porządku rosnącym „id”. Dlatego jeśli wstawiony rekord ma identyfikator równy 5, rekord zostanie wstawiony w piątym wierszu tabeli zamiast w pierwszym wierszu. Podobnie, jeśli czwarty rekord ma identyfikator 3, zostanie wstawiony do trzeciego wiersza zamiast czwartego. Dzieje się tak, ponieważ indeks klastrowy musi utrzymywać fizyczną kolejność przechowywanych rekordów zgodnie z indeksowaną kolumną, tj. Id. Aby zobaczyć tę kolejność w akcji, wykonaj następujący skrypt:
Powyższy skrypt wstawia dziesięć rekordów do tabeli uczniów. Zwróć uwagę, że rekordy są wstawiane w losowej kolejności wartości w kolumnie „id”, ale ze względu na domyślny indeks grupowany w kolumnie id rekordy są fizycznie przechowywane w kolejności rosnącej wartości w kolumnie „id”. Wykonaj następującą instrukcję SELECT, aby pobrać rekordy z tabeli uczniów.
1
2
3
4
5
|
UŻYJ schooldb
SELECT * FROM student
|
Rekordy zostaną pobrane w następującej kolejności:
Tworzenie niestandardowego indeksu klastrowego
Możesz utworzyć własny indeks niestandardowy, a także domyślny indeks klastrowany. Aby utworzyć nowy indeks klastrowy w tabeli, musisz najpierw usunąć poprzedni indeks.
Aby usunąć indeks, przejdź do „Object Explorer- > Databases- > Database_Name- > Tabele- > Nazwa_tabeli – > Indeksy”. Kliknij prawym przyciskiem myszy indeks, który chcesz usunąć, i wybierz USUŃ . Zobacz poniższy zrzut ekranu.
Teraz aby utworzyć nowy indeks klastrowy, wykonaj następujący skrypt:
1
2
3
4
5
6
|
użyj schooldb
UTWÓRZ INDEKS KLUSTEROWANY IX_tblStudent_Gender_Score
ON student (płeć ASC, total_score DESC)
|
Proces tworzenia Tworzenie indeksu klastrowego jest podobne do normalnego indeksu z jednym wyjątkiem. W przypadku indeksu klastrowego należy użyć słowa kluczowego „CLUSTERED” przed „INDEX”.
Powyższy skrypt tworzy indeks klastrowy o nazwie „IX_tblStudent_Gender_Score” w tabeli uczniów. Indeks ten jest tworzony w kolumnach „gender” i „total_score”. Indeks utworzony w więcej niż jednej kolumnie nosi nazwę „indeks złożony”.
Powyższy indeks najpierw sortuje wszystkie rekordy w kolejności rosnącej według płci. Jeśli płeć jest taka sama dla dwóch lub więcej rekordów, rekordy są sortowane w kolejności malejącej wartości w kolumnie „total_score”. Możesz również utworzyć indeks klastrowany w jednej kolumnie. Teraz, jeśli wybierzesz wszystkie rekordy z student tabeli, zostaną pobrane w następującej kolejności:
Indeksy nieklastrowe
Indeks nieklastrowy nie sortuje fizycznych danych wewnątrz tabeli. indeks nieklastrowy jest przechowywany w jednym miejscu, a dane tabeli w innym miejscu. Jest to podobne do podręcznika, w którym zawartość książki znajduje się w jednym miejscu, a indeks w innym. Pozwala to na więcej niż jeden nieklastrowy indeks na tabelę.
Należy tutaj wspomnieć, że w tabeli dane będą sortowane według indeksu klastrowego. Jednak wewnątrz indeksu nieklastrowego dane są przechowywane w określonej kolejności. Indeks zawiera wartości kolumn, na podstawie których tworzony jest indeks, oraz adres rekordu, do którego należy wartość kolumny.
Gdy zapytanie skierowane jest do kolumny, dla której utworzono indeks, baza danych najpierw przejdzie do indeksu i wyszuka adres odpowiedniego wiersza w tabeli. Następnie przejdzie do tego adresu wiersza i pobierze inne wartości kolumn. To z powodu tego dodatkowego kroku indeksy nieklastrowe są wolniejsze niż indeksy klastrowe.
Tworzenie indeksu nieklastrowego
Składnia tworzenia indeksu nieklastrowego jest podobna do indeks klastrowy. Jednak w przypadku indeksu nieklastrowanego słowo kluczowe „NONCLUSTERED” jest używane zamiast „CLUSTERED”. Spójrz na poniższy skrypt.
1
2
3
4
5
6
|
użyj schooldb
UTWÓRZ INDEKS NONCLUSTERED IX_tblStudent_Name
ON student (imię ASC)
|
Powyższy skrypt tworzy nieklastrowany indeks w kolumnie „nazwa” tabeli uczniów. Indeks jest sortowany według nazwy w porządku rosnącym. Jak powiedzieliśmy wcześniej, dane tabeli i indeks będą przechowywane w różnych miejscach. Rekordy tabeli zostaną posortowane według indeksu klastrowego, jeśli taki istnieje. Indeks zostanie posortowany zgodnie z jego definicją i będzie przechowywany oddzielnie ze stołu.
Dane tabeli uczniów:
IX_tblStudent_Name Dane indeksu
name | Row Address |
Alan | Wiersz Adres |
Elis | Row Address |
Jolly | Row Address |
Jon | Row Address |
Joseph | Row Address |
Kate | Row Address |
Laura | Row Address |
Myszy | Adres wiersza |
Sara | Adres wiersza |
Wise | Row Address |
Uwaga , tutaj w indeksie każdy wiersz ma kolumnę, która przechowuje adres wiersza, do którego należy nazwa. Więc jeśli zostanie wysłane zapytanie w celu pobrania płci i daty urodzenia ucznia o imieniu „Jon”, baza danych najpierw przeszuka imię „Jon” w indeksie. Następnie odczyta adres wiersza „Jon” i przejdzie bezpośrednio do tego wiersza w tabeli „uczeń”, aby pobrać płeć i datę urodzenia Jona.
Wniosek
Z dyskusji znajdujemy następujące różnice między indeksami klastrowymi i nieklastrowymi.
- W tabeli może być tylko jeden indeks klastrowy. Można jednak utworzyć wiele indeksów nieklastrowych w jednej tabeli.
- Klastrowane indeksy służą tylko do sortowania tabel. Dlatego nie zajmują dodatkowego miejsca do przechowywania. Indeksy nieklastrowe są przechowywane w innym miejscu niż rzeczywista tabela, która zajmuje więcej miejsca.
- Indeksy klastrowe są szybsze niż indeksy nieklastrowe, ponieważ nie wymagają żadnego dodatkowego kroku wyszukiwania.
Inne świetne artykuły Bena
Różnica między tożsamością & Sekwencja w SQL Server
Jaka jest różnica między indeksami klastrowymi i nieklastrowanymi w SQL Server?
- Autor
- Najnowsze posty
Wyświetl wszystkie posty Bena Richardsona
- Power BI: Waterfall Charts and Combined Visuals – 19 stycznia 2021
- Power BI : Formatowanie warunkowe i kolory danych w akcji – 14 stycznia 2021 roku
- Power BI: Importowanie danych z SQL Server i MySQL – 12 stycznia 2021
573 279 wyświetleń
© 2021 Quest Software Inc. WSZELKIE PRAWA ZASTRZEŻONE. | RODO | Warunki użytkowania | Prywatność