2013-03-27 22 views
6

Niedawno wprowadzono do dostrajania bazy danych. Mam kilka pomysłów na temat SQL Server i postanowiłem stworzyć indeks.TWORZENIE INDEKSU SQL Server 2008

Zaproszony to http://sqlserverplanet.com/ddl/create-index

Ale ja nie rozumiem, jak inne rodzaje Główna jak INCLUDE, WITH opcje pomoże. Próbowałem google, ale nie udało mi się zobaczyć prosty opis, kiedy z nich korzystać.

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
INCLUDE (President,YearsInOffice,RatingPoints) 
WHERE ElectoralVotes IS NOT NULL 

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
WITH (DATA_COMPRESSION = ROW) 

CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber 
ON dbo.Presidents (PresidentNumber) 
WITH (DATA_COMPRESSION = PAGE) 

W jakim scenariuszu powinienem użyć powyższych? Czy zwiększą wydajność?

Odpowiedz

2

Nie mogę rozmawiać z opcją kompresji danych, ale opcja Uwzględnij może zdecydowanie poprawić wydajność. Jeśli wybierzesz tylko PresidentNumber i jedną lub więcej kolumn President, YearsInOffice lub RatingPoints, a ElectoralVotes nie ma wartości NULL, zapytanie otrzyma wartości z samego indeksu i nie będzie musiała dotykać podstawowej tabeli. Jeśli twoja tabela ma dodatkowe kolumny i uwzględnisz jedną z nich w zapytaniu, będzie musiała pobrać wartości z tabeli oraz z indeksu.


Select top 20 PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
where ElectoralVotes IS NOT NULL 

Powyższe zapytanie tylko do odczytu z IX_NC_PresidentNumber i nie trzeba ciągnąć dane z tabeli prezydentów ponieważ wszystkie kolumny z kwerendy są uwzględniane w indeksie

Select top 20 PresidentNumber, President, YearsInOffice, PoliticalParty 
From Presidents 
where ElectoralVotes IS NOT NULL 

To zapytanie użyje indeks IX_NC_PresidentNumber i tabela Presidents, ponieważ kolumna PoliticalParty w zapytaniu nie jest uwzględniona w indeksie.

Select PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
Where RatingPoints > 50 

To zapytanie będzie najprawdopodobniej kończy się robi skanowanie tabeli, ponieważ gdy klauzula w zapytaniu kontra klauzuli WHERE stosowanych w indeksie nie pasują i nie ma limitu na ROWCOUNT.

+0

Czy możesz dodać przykładowe zapytanie tutaj. Z łatwością pomoże mi to przemyśleć i zrozumieć :) – Billa

+0

Wygląda dobrze. Musimy więc dodać indeks do wszystkich kolumn w instrukcji SELECT, aby uzyskać dobrą wydajność? aby uniknąć skanowania tabeli. – Billa

+0

Nie, nie trzeba dodawać wszystkich kolumn do indeksu, aby uniknąć skanowania tabeli. Aby uniknąć skanowania tabeli, musisz mieć indeksy na kolumnach, których używasz w klauzuli where. Wzrost wydajności, jaki zobaczysz, polega na tym, że wszystkie kolumny w indeksie są stosunkowo niewielkie, ponieważ indeks zawiera wskaźniki do wierszy. Duży zysk ma indeksy na kolumnach filtrów. – BlackICE

4

Kompresja danych również pomoże w wykonaniu zapytań, ponieważ po kompresji, po uruchomieniu zapytania zostanie zmniejszona liczba stron/zakresów, ponieważ operacje wejścia/wyjścia są zredukowane, zmniejszenie liczby we/wy jest zawsze dobrym wyborem.

Powiązane problemy