Udostępnij za pomocą


Indeksy klastrowane i nieklastrowane

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Indeks to struktura dysku skojarzona z tabelą lub widokiem, która przyspiesza pobieranie wierszy z tabeli lub widoku. Indeks zawiera klucze utworzone na podstawie co najmniej jednej kolumny w tabeli lub widoku. Te klucze są przechowywane w strukturze (B-tree), która umożliwia programowi SQL Server szybkie i wydajne znajdowanie wierszy skojarzonych z wartościami kluczy.

Note

W dokumentacji jest zwykle używany termin B-tree w odniesieniu do indeksów. W indeksach typu rowstore silnik bazy danych implementuje drzewo B+. Nie dotyczy to indeksów magazynu kolumn ani indeksów w tabelach zoptymalizowanych pod kątem pamięci. Aby uzyskać więcej informacji, zobacz architekturę i przewodnik projektowania indeksu SQL Server i Azure SQL.

Tabela lub widok może zawierać następujące typy indeksów:

  • Clustered

    • Indeksy klastrowane sortują i przechowują wiersze danych w tabeli lub widoku na podstawie ich wartości klucza. Te wartości klucza to kolumny zawarte w definicji indeksu. Może istnieć tylko jeden indeks klastrowany na tabelę, ponieważ wiersze danych mogą być przechowywane tylko w jednej kolejności.
    • Jedynym razem, gdy wiersze danych w tabeli są przechowywane w kolejności sortowania, jest to, gdy tabela zawiera indeks klastrowany. Gdy tabela ma indeks klastrowany, tabela jest nazywana tabelą klastrowaną. Jeśli tabela nie ma indeksu klastrowanego, jego wiersze danych są przechowywane w nieurządzanej strukturze nazywanej stertą.
  • Nonclustered

    • Indeksy nieklastrowane mają strukturę oddzieloną od wierszy danych. Indeks nieklastrowany zawiera nieklastrowane wartości klucza indeksu, a każdy wpis wartości klucza ma wskaźnik do wiersza danych zawierającego wartość klucza.

    • Wskaźnik z wiersza indeksu w indeksie nieklastrowanym do wiersza danych jest nazywany lokalizatorem wierszy. Struktura lokalizatora wierszy zależy od tego, czy strony danych są przechowywane w stercie, czy w tabeli klastrowanej. W przypadku sterty lokalizator wierszy jest wskaźnikiem do wiersza. W przypadku tabeli klastrowanej lokalizator wierszy jest kluczem indeksu klastrowanego.

    • Możesz dodać kolumny niekluczowe do poziomu liści indeksu nieklastrowanego, aby pominąć istniejące limity kluczy indeksu i wykonywać w pełni pokryte zapytania. Aby uzyskać więcej informacji, zobacz Tworzenie indeksów z dołączonymi kolumnami. Aby uzyskać szczegółowe informacje na temat limitów kluczy indeksu, zobacz Maksymalna specyfikacja pojemności dla programu SQL Server.

Indeksy klastrowane i nieklastrowane mogą być unikatowe. W przypadku indeksu unikatowego żadne dwa wiersze nie mogą mieć tej samej wartości dla klucza indeksu. W przeciwnym razie indeks nie jest unikatowy, a wiele wierszy może mieć tę samą wartość klucza. Aby uzyskać więcej informacji, zobacz Tworzenie unikatowego indeksu.

Indeksy są automatycznie zachowywane dla tabeli lub widoku za każdym razem, gdy dane tabeli zostaną zmodyfikowane.

Zobacz Indeksy , aby uzyskać więcej typów indeksów specjalnego przeznaczenia.

Indeksy i ograniczenia

Program SQL Server automatycznie tworzy indeksy, gdy ograniczenia PRIMARY KEY i UNIQUE są definiowane na kolumnach tabeli. Na przykład podczas tworzenia tabeli z ograniczeniem UNIQUE aparat bazy danych automatycznie tworzy indeks nieklastrowany. Gdy skonfigurujesz PRIMARY KEY, aparat bazy danych automatycznie tworzy indeks klastrowany, chyba że ten indeks już istnieje. Podczas próby wymuszenia PRIMARY KEY ograniczenia dla istniejącej tabeli, gdy w tej tabeli istnieje już indeks klastrowany, SQL Server wymusza klucz podstawowy, używając indeksu nieklastrowanego.

Aby uzyskać więcej informacji, zobacz Tworzenie kluczy podstawowych i Tworzenie unikatowych ograniczeń.

Jak indeksy są używane przez optymalizator zapytań

Dobrze zaprojektowane indeksy mogą zmniejszyć liczbę operacji we/wy dysku i zużywać mniej zasobów systemowych. W związku z tym te indeksy zwiększają wydajność zapytań. Indeksy mogą być przydatne w przypadku różnych zapytań zawierających SELECT, UPDATE, DELETE lub MERGE. Rozważ zapytanie SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 w AdventureWorks2025 bazie danych. Po wykonaniu tego zapytania optymalizator zapytań ocenia każdą dostępną metodę pobierania danych i wybiera najbardziej wydajną metodę. Metoda może być skanowaniem tabeli lub skanowaniem co najmniej jednego indeksu, jeśli istnieją.

Podczas skanowania tabeli optymalizator zapytań odczytuje wszystkie wiersze w tabeli i wyodrębnia wiersze spełniające kryteria zapytania. Skanowanie tabeli generuje wiele operacji we/wy dysku i może być intensywnie korzystających z zasobów. Jednak skanowanie tabeli może być najbardziej wydajną metodą, jeśli na przykład zapytanie zwraca dużą część wierszy z tabeli.

Gdy optymalizator zapytań używa indeksu, wyszukuje kolumny klucza indeksu, znajduje lokalizację przechowywania wierszy wymaganych przez zapytanie i wyodrębnia pasujące wiersze z tej lokalizacji. Ogólnie rzecz biorąc, wyszukiwanie indeksu jest znacznie szybsze niż przeszukiwanie tabeli. W przeciwieństwie do tabeli indeks często zawiera bardzo niewiele kolumn na wiersz, a wiersze są sortowane w kolejności.

Optymalizator zapytań zazwyczaj wybiera najbardziej wydajną metodę podczas wykonywania zapytań. Jeśli jednak nie są dostępne żadne indeksy, optymalizator zapytań musi użyć skanowania tabeli. Twoim zadaniem jest zaprojektowanie i utworzenie indeksów najlepiej dopasowanych do środowiska, dzięki czemu optymalizator zapytań ma wybór wydajnych indeksów, z których chcesz wybrać. Program SQL Server udostępnia doradcę dostrajania aparatu bazy danych , który pomaga w analizie środowiska bazy danych i w wyborze odpowiednich indeksów.

Important

Aby uzyskać więcej informacji na temat wytycznych dotyczących projektowania indeksów i elementów wewnętrznych, zapoznaj się z przewodnikiem dotyczącym architektury i projektowania indeksów SQL dla programu SQL Server i usługi Azure SQL.