2010-08-02 13 views
7

Witajcie eksperci silnika SQL Server; proszę podzielić się z nami odrobiną waszego wglądu ...Wydajność serwera SQL: indeks nieklastrowy + kolumny INCLUDE a indeks klastrowany - odpowiednik?

Jak rozumiem, INCLUDE kolumny w indeksie nieklastrowanym pozwalają na przechowywanie dodatkowych, nie-kluczowych danych na stronach indeksu.

Doskonale zdaję sobie sprawę z zalet wydajności, jaką ma indeks klastrowy w porównaniu z indeksem nieklastrowym, po prostu z powodu mniejszej liczby kroków, jakie silnik musi wykonać w celu pobrania danych w celu uzyskania danych na dysku.

Jednak ponieważ kolumny INCLUDE są wyświetlane w indeksie nieklastrowanym, można oczekiwać, że następujące zapytanie będzie miało zasadniczo taką samą wydajność w scenariuszach 1 i 2, ponieważ wszystkie kolumny mogą być pobierane ze stron indeksu w scenariuszu 2, a nie w ogóle korzystając ze stron danych tabeli?

ZAPYTANIE

SELECT A, B, C FROM TBL ORDER BY A 

SCENARIUSZ 1

CREATE CLUSTERED INDEX IX1 ON TBL (A, B, C); 

SCENARIUSZ 2

CREATED NONCLUSTERED INDEX IX1 ON TBL (A) INCLUDE (B, C); 
+0

Co mówi rzeczywisty plan kwerendy podczas przełączania między konfiguracjami indeksu? –

+0

będzie zależeć od ogólnego obciążenia pracą zapytania trafiającego do tej tabeli. –

+0

Co ciekawe, indeks nieklastrowy jest preferowany w planie kwerend, ale możliwość korzystania z podpowiedzi kwerendy, złożoności silnika w podejmowaniu decyzji o optymalnym planie kwerendy opartym na wolumenie danych i kto wie, jakie inne czynniki pozostawiają dla mnie tę trwającą zagadkę. Naprawdę szukam kogoś, kto powie coś do powiedzenia i powie: kolumny INCLUDE to nie wszystko, z czego są z jakiegoś powodu ... – Tahbaza

Odpowiedz

3

Na tym przykładzie może rzeczywisty można uzyskać lepszą wydajność za pomocą indeksu nieklastrowego. Ale to naprawdę zależy od dodatkowych informacji, których nie dostarczyłeś. Oto kilka myśli.

Serwer SQL przechowuje informacje na stronach 8 KB; obejmuje to dane i indeksy. Jeśli Twoja tabela zawiera tylko kolumny A, B i C, dane będą przechowywane na mniej więcej takiej samej liczbie stron danych i na stronach stron niesklasyfikowanych. Jeśli jednak w tabeli będzie więcej kolumn, dane będą wymagać więcej stron. Liczba stron indeksu nie będzie się różnić.

Tak więc, w tabeli z większą liczbą kolumn niż potrzeby zapytań, zapytanie będzie działać lepiej z nieklastrowanym indeksem pokrywającym (indeks ze wszystkimi kolumnami). Będzie w stanie przetworzyć mniej stron, aby zwrócić pożądane wyniki.

Oczywiście różnice w wydajności mogą nie być widoczne, dopóki nie uzyskasz bardzo dużej liczby wierszy.

5

Rzeczywiście indeks klastrowany z pokryciem zawiera kolumny mogą odgrywać dokładnie taką samą rolę jak indeks klastrowany. Koszt jest w czasie aktualizacji: więcej zawiera kolumny oznacza, że ​​więcej indeksów musi zostać zaktualizowanych po zmianie wartości kolumny w tabeli podstawowej (w indeksie klastrowym). Ponadto w przypadku większej liczby kolumn zwiększa się rozmiar danych: baza danych staje się większa i może to skomplikować operacje konserwacyjne.

Podsumowując, należy zachować równowagę między wartością pokrycia dodatkowych indeksów, a większą liczbą kolumn a kosztem aktualizacji i zwiększeniem rozmiaru danych.

Powiązane problemy