Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Kolumny dołączone (INCLUDE)

Termin Definicja
Kolumny dołączone (INCLUDE)

Kolumny dołączone (INCLUDE) to pola przechowywane na poziomie liści indeksu, niebędące częścią jego klucza.

Kolumny INCLUDE w indeksach SQL Server

W Microsoft SQL Server klauzula INCLUDE służy do dodawania kolumn niekluczowych do indeksu nieklastrowanego. Kolumny wymienione po INCLUDE są przechowywane na poziomie liści indeksu, ale nie uczestniczą w jego kluczu. Przykładowa definicja wygląda tak: CREATE INDEX IX_Klienci_Nazwisko ON dbo.Klienci (Nazwisko) INCLUDE (Imie, Miasto); W tym przypadku Nazwisko jest kolumną kluczową, a Imie i Miasto są kolumnami dołączonymi.

SQL Server może wykorzystać taki indeks do wyszukania wierszy oraz odczytania dodatkowych wartości bez wykonywania operacji Key Lookup lub RID Lookup do tabeli bazowej. Indeks obejmujący wszystkie kolumny potrzebne zapytaniu nazywa się indeksem pokrywającym, ponieważ zapytanie może zostać obsłużone wyłącznie na podstawie zawartości indeksu. Nie oznacza to jednak, że każda kolumna powinna być automatycznie dołączana. Każde dodatkowe pole zwiększa rozmiar indeksu i koszt jego utrzymywania.

Różnica między kluczem indeksu a kolumną dołączoną

Kolumny kluczowe indeksu określają jego uporządkowanie. SQL Server może używać ich w predykatach wyszukiwania, warunkach łączenia oraz sortowaniu, zależnie od planu wykonania i kolejności kolumn w kluczu. Kolumny po INCLUDE nie wpływają na kolejność wpisów indeksu i nie są używane do nawigowania po strukturze B-drzewa. Służą przede wszystkim do zwrócenia danych wymaganych przez zapytanie.

Przykładowo indeks CREATE INDEX IX_Zamowienia_Klient ON dbo.Zamowienia (KlientID) INCLUDE (DataZamowienia, Kwota); może pomóc zapytaniu SELECT DataZamowienia, Kwota FROM dbo.Zamowienia WHERE KlientID = 42; Kolumna KlientID pozwala znaleźć odpowiednie wpisy, natomiast DataZamowienia i Kwota są odczytywane z poziomu liści. Gdyby te dwie kolumny nie znajdowały się w indeksie, silnik mógłby dla znalezionych rekordów sięgać do tabeli podstawowej.

Kolumna dołączona nie może zastępować kolumny kluczowej, jeśli zapytanie musi filtrować lub sortować według tej kolumny. Jeżeli na przykład zapytania wyszukują rekordy po Status, umieszczenie Status wyłącznie w INCLUDE nie zapewnia takiej samej możliwości wyszukiwania jak dodanie jej do klucza indeksu. Dobór kolejności i rodzaju kolumn wymaga analizy rzeczywistych predykatów, sortowania, grupowania oraz listy zwracanych pól.

Wpływ INCLUDE na rozmiar i utrzymanie indeksu

Kolumny dołączone zwiększają ilość danych zapisanych w indeksie nieklastrowanym. Większy indeks zajmuje więcej miejsca w plikach danych i wymaga odczytania większej liczby stron podczas skanowania. Jednocześnie może ograniczyć liczbę operacji odwołujących się do tabeli bazowej, dlatego ocena opłacalności zależy od częstotliwości zapytań oraz liczby zwracanych wierszy.

Indeks nieklastrowany musi być aktualizowany przy zmianach danych w tabeli. Modyfikacja wartości kolumny dołączonej może wymagać zapisania zmiany w indeksie, mimo że kolumna ta nie jest elementem klucza. Wstawianie, aktualizowanie i usuwanie rekordów może więc wykonywać więcej operacji wejścia-wyjścia. Nadmiar indeksów obejmujących podobne zestawy kolumn zwiększa także czas operacji DML oraz zużycie pamięci podczas ich obsługi.

Przy projektowaniu indeksu należy uwzględnić ograniczenia SQL Server dotyczące kolumn dołączonych. Kolumny wskazane w INCLUDE muszą pochodzić z tabeli lub widoku, na którym tworzony jest indeks, i nie mogą być kolumnami typu text, ntext ani image. SQL Server pozwala natomiast używać jako kolumn dołączonych między innymi typów varchar(max), nvarchar(max) i varbinary(max), o ile spełnione są pozostałe wymagania dotyczące indeksu i definicji obiektu.

Ocena indeksu obejmującego zapytanie

Przy sprawdzaniu zasadności klauzuli INCLUDE należy porównać plan wykonania przed utworzeniem indeksu i po jego utworzeniu. W SQL Server Management Studio można włączyć rzeczywisty plan wykonania, a następnie sprawdzić, czy zniknęła operacja Key Lookup lub RID Lookup oraz czy zmieniły się przewidywane i rzeczywiste koszty operatorów. Sam fakt istnienia indeksu nie gwarantuje jego użycia, ponieważ optymalizator bierze pod uwagę selektywność danych, statystyki, koszt odczytu i liczbę zwracanych rekordów.

Warto analizować zapytania w ich rzeczywistej postaci, łącznie z klauzulami WHERE, JOIN, ORDER BY i SELECT. Dodanie do INCLUDE wyłącznie pól zwracanych przez zapytanie może usunąć lookup, ale nie poprawi wyszukiwania, jeśli klucz indeksu nie odpowiada warunkom filtrującym. Po zmianie indeksów należy obserwować czas wykonania, liczbę odczytów logicznych oraz koszty operacji modyfikujących dane. Usunięcie lub przebudowę indeksu powinno poprzedzać sprawdzenie jego wykorzystania w obciążeniu produkcyjnym, ponieważ rzadko używany indeks może nadal obsługiwać ważne, okresowe zadania.

Kolumny INCLUDE są więc narzędziem do precyzyjnego rozszerzania indeksu nieklastrowanego w Microsoft SQL Server. Ich prawidłowe zastosowanie polega na rozdzieleniu kolumn potrzebnych do wyszukiwania od tych, które są potrzebne jedynie do zwrócenia wyniku. Ostateczna decyzja powinna wynikać z planów wykonania i pomiarów, a nie tylko z listy kolumn występujących w zapytaniu.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę