Administracja i programowanie Administracja i programowanie pod Microsoft SQL Server 2000pod Microsoft SQL Server 2000
Paweł RajbaPaweł Rajba
[email protected]://www.kursy24.eu/
Zawartość modułu 7Zawartość modułu 7
IndeksyWprowadzenieRodzaje indeksówWybór indeksów
wybór indeksu zgrupowanegoTworzenie, usuwanie i przebudowanie indeksówPobieranie informacji o indeksachFragmentacja indeksów
wykrywanie i pozbywanie się fragmentacjiTworzenie, odświeżanie i wyświetlanie statystyk
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 1 -
WprowadzenieWprowadzenie
Zalety stosowania indeksówZwiększają szybkość wyszukiwania wierszy spełniających zadane warunkiPrzyspieszają operacje złączenia, sortowania i grupowaniaPozwalają wymusić unikalność wierszy, jeśli indeks został zdefiniowany z odpowiednim parametremDobrze jest zakładać indeks na kolumny o wysokim stopniu selektywności, czyli takie, gdzie wiersze się niewiele powtarzają
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 2 -
WprowadzenieWprowadzenie
Wady stosowania indeksówZużywają miejsce na dyskuOgólnie generują koszty związane z utrzymywaniem indeksów, stąd nie należy tworzyć indeksów, które będą rzadko używane
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 3 -
Rodzaje indeksówRodzaje indeksów
Indeksy zgrupowaneIndeks jest B-drzewem, w którym w liściach są nie wskaźniki ale właściwe strony danych z danymiLiście B-drzewa tworzą podwójną listę zwaną łańcuchem stronKolejność stron w łańcuchu odpowiada kolejności liści w drzewie indeksowym
W związku z powyższym można utworzyć tylko jeden taki indeks i jest zalecane taki indeks utworzyćTo tak naprawdę nie jest tak, że indeksowane dane są spójne na dysku (jest to technicznie niemożliwe)
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 5 -
Rodzaje indeksówRodzaje indeksów
Indeksy niezgrupowaneDane z wierszy są pamiętane w stronach, które są połączone w listę dwukierunkową (łańcuch)Kolejność stron w łańcuchu nie jest ustalonaIndeks jest niezależnym B-drzewem, w którym liście zawierają wskaźniki na właściwe strony zawierające szukane rekordy
kiedy jest indeks zgrupowany, to jest wskaźnik do tego indeksu, a kiedy go nie ma, jest adres strony
Można utworzyć maksymalnie 249 indeksów niezgrupowanych
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 4 -
Wybór indeksówWybór indeksów
Co indeksowaćklucze główneklucze obce oraz kolumny biorące częsty udział w złączeniach tabelkolumny, z których wyciągane są zakresy danychkolumny, których wartości są sortowanekolumny, na których wykonywane jest grupowanie i agregacja wartości
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 6 -
Wybór indeksówWybór indeksów
Czego nie indeksowaćkolumn, które rzadko są wykorzystywane w zapytaniachkolumn, które mają kilka wartościkolumn o typach danych: text, ntext, image
tych kolumn nie da się indeksować
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 7 -
Wybór indeksu zgrupowanegoWybór indeksu zgrupowanego
Jak dobrać indeks zgrupowanykiedy chcemy zoptymalizować operacje wstawiania do obciążonej tabeli, warto rozpatrzyć utworzenie indeksu na kolumnie będącej identyfikatorem (PK, int)tabele często sortowane, grupowane lub przeszukiwane pod kątem zakresu danych warto indeksować po kolumnie względem której te operacje są wykonywane (np. raporty po dacie)ogólne zasady
ograniczyć liczbę kolumn w indeksiejak najmniej znaków w typach varchar i charjak najmniejszy typ danych, np. tinyint zamiast int
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 8 -
Tworzenie indeksówTworzenie indeksów
Indeks tworzymy poleceniem CREATE INDEXIndeks tworzymy poleceniem CREATE INDEXSkładniaSkładniaCREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX INDEX nazwanazwa ON { ON { table table || view view } } ( ( column column [ ASC | DESC ] [ [ ASC | DESC ] [ ,,......n n ] ] ) ) [ WITH <opcja> [ [ WITH <opcja> [ ,,......nn] ] ] ] [ ON [ ON filegroup filegroup ]]
Wybrane opcjeWybrane opcjeFILLFACTORFILLFACTORPAD_INDEXPAD_INDEXDROP_EXISTINGDROP_EXISTINGSORT_IN_TEMPDBSORT_IN_TEMPDB
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 9 -
Tworzenie indeksówTworzenie indeksów
Indeks...Opcje
FILLFACTOR = fillfactoropcja określa stopień zapełnienia liści w drzewie indeksu (stron indeksów) w momencie
● tworzenia indeksu● przebudowania indeksu
opcja ma większe znaczenie przy tworzeniu indeksów zgrupowanychwartości są od 0 do 100 (0 i 100 oznaczają 100% zapełnienie)domyślna wartość to 0, można ją zmienić dla całego serwera poleceniem sp_configure_fillfactor
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 10 -
Tworzenie indeksówTworzenie indeksów
Indeks...Opcje
PAD_INDEXokreśla stopień zapełnienia wierzchołków wewnętrznych drzewa indeksuwartość jest pobierana z opcji FILLFACTOR, stąd jej użycie ma sens wtedy, gdy użyta jest opcja FILLFACTOR
DROP_EXISTINGokreśla, że dany indeks powinien zostać usunięty i przebudowany w jednej transakcji (indeks musi istnieć)szczególnie przydatne przy przebudowywaniu indeksu zgrupowanego – przy usuwaniu lub tworzeniu indeksu zgrupowanego przebudowywane są także indeksy niezgrup.
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 11 -
Tworzenie indeksówTworzenie indeksów
Indeks...Indeks...OpcjeOpcje
SORT_IN_TEMPDBSORT_IN_TEMPDBdecyduje, że pośrednie wyniki sortowania będą decyduje, że pośrednie wyniki sortowania będą przechowywane w bazie tempdbprzechowywane w bazie tempdbwpływa na poprawę szybkości tworzenia indeksu wpływa na poprawę szybkości tworzenia indeksu szczególnie wtedy, gdy bazę tempdb obsługuje np. szczególnie wtedy, gdy bazę tempdb obsługuje np. inny dyskinny dysk
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 12 -
Tworzenie indeksówTworzenie indeksów
Tworzenie tabeli a indeksyPrzy tworzeniu PRIMARY KEY
tworzony jest indeks na kolumny kluczadomyślnie tworzony indeks jest zgrupowany, różnowartościowy
Przy określeniu UNIQUErównież tworzony jest indeks na kolumny kluczadomyślnie tworzony indeks jest niezgrupowany, różnowartościowy
Przy tworzeniu kolumny tabeli można dodatkowe parametry: clustered, nonclustered, fillfactor
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 13 -
Tworzenie indeksówTworzenie indeksów
Przy tworzeniu indeksów UNIQUESQL Server sprawdza istniejące dane pod kątem różnych wartości. Jeśli są powtórzenia, zostanie zwrócony błąd na pierwszym powtarzającym się wierszuMożna wykorzystać poniższą procedurę do sprawdzenia, które wiersze ile razy się powtarzają
SELECT kolumna, COUNT (kolumna)FROM tabelaGROUP BY kolumnaHAVING COUNT(kolumna)>1 ORDER BY kolumna
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 14 -
Tworzenie indeksówTworzenie indeksów
Tworzenie indeksów złożonychjest to indeks oparty na co najmniej 2 kolumnachkolumny muszą być z tej samej tabeli (chyba, że tworzymy indeks na widoku)warto najpierw podać kolumnę bardziej unikalną (np. nazwisko, a potem imię)w klauzuli WHERE należy podać pierwszą kolumnę indeksu, żeby indeks został wykorzystanyindeksy na (kol1, kol2) i na (kol2, kol1) są różneużycie tych indeksów może zredukować ilość ogólnie utworzonych indeksów
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 15 -
Tworzenie indeksówTworzenie indeksów
Indeksy na kolumnach wyliczeniowychIndeks można utworzyć, gdy
wyrażenie kolumnowe jest deterministyczne (np. funkcja getdate() nie jest deterministyczna)przy tworzeniu tabeli, opcja połączenia ANSI_NULL jest ustawiona na ON
to, czy była włączona, można sprawdzić poleceniemif objectproperty( object_id('tabela'), 'IsAnsiNullsOn')=1 print 'ANSI_NULL'
wyrażenie nie może być oparte na kolumnie o typie text, ntext lub image
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 16 -
Tworzenie indeksówTworzenie indeksów
Indeksy na kolumnach wyliczeniowychIndeks można utworzyć, gdy
przy tworzeniu tabeli i przy operacjach, które modyfikują indeks (insert, update, delete) opcje połączenia
ANSI_NULLSANSI_PADDINGANSI_WARNINGSARITHABORTCONCAT_NULL_YIELDS_NULLQUOTED_IDENTIFIER
powinny być włączone, natomiast opcjaNUMERIC_ROUNDABORT
powinna być wyłączonaMicrosoft SQL Server 2000 Copyright © Paweł Rajba- 17 -
Tworzenie indeksówTworzenie indeksów
Indeksy na kolumnach wyliczeniowychJeśli któryś z przedstawionych warunków nie będzie spełniony, procesor kwerend może indeks na kolumnie wyliczeniowej zignorować.
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 18 -
Usuwanie indeksuUsuwanie indeksu
Usuwanie indeksu odbywa się poprzezDROP INDEX w przypadku indeksów utworzonych za pomocą CREATE INDEXALTER TABLE w przypadku indeksów utworzonych przy tworzeniu tabeli
Przy usuwaniu tabeli usuwane są wszystkie związane z nią indeksyDROP INDEX nie może być użyty wobec tabel systemowych
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 19 -
Przebudowanie indeksuPrzebudowanie indeksu
Do przebudowania indeksu jest polecenie Do przebudowania indeksu jest polecenie DBCC DBREINDEXDBCC DBREINDEX
SkładniaSkładniaDBCC DBREINDEX DBCC DBREINDEX ( ( [ [ ''bazabaza..właścicielwłaściciel..tabelatabela' ' [ [ ,, index index [ [ ,, fillfactor fillfactor ] ] ] ] ] ] ))[ WITH NO_INFOMSGS ] [ WITH NO_INFOMSGS ]
UwagiUwagiindex – nazwa indeksu, jeśli podamy '', przebudowane index – nazwa indeksu, jeśli podamy '', przebudowane będą wszystkie indeksybędą wszystkie indeksyopcja WITH NO_INFOMSGS – wyłącza pojawianie się opcja WITH NO_INFOMSGS – wyłącza pojawianie się komunikatów informacyjnych (poziom 0 do 10)komunikatów informacyjnych (poziom 0 do 10)
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 20 -
Przebudowanie indeksuPrzebudowanie indeksu
Indeks jest przebudowywany automatycznieprzy tworzeniu indeksu zgrupowanegoprzy usuwaniu indeksu zgrupowanegoprzy użyciu opcji DROP_EXISTING
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 21 -
Pobieranie informacji o indeksachPobieranie informacji o indeksach
Można to robić za pomocą dwóch procedursp_help tabelasp_helpindex tabela
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 22 -
PrzykładyPrzykłady
sqlserver-p07-01.sqlsqlserver-p07-02A.sqlsqlserver-p07-02B.sqlsqlserver-p07-03.sql
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 23 -
Fragmentacja indeksówFragmentacja indeksów
Fragmentacja pojawia się przy modyfikacji tabeliRodzaje fragmentacji
wewnętrznaoznacza stopień niewykorzystania stron indeksówczęsto pożądana, ustalana poprzez parametr fillfactor
zewnętrznapojawia się, gdy
logiczna kolejność stron nie odpowiada kolejności fizycznejobszary należące do tabeli nie sąsiadują z sobą
kłopotliwa, gdy SQLServer np. skanuje wszyskie elementy tabeli lub indeksu
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 24 -
Wykrywanie fragmentacjiWykrywanie fragmentacji
Do wykrywania fragmentacji służy polecenie DBCC SHOWCONTIG
SkładniaDBCC SHOWCONTIG [ ( { table_name | table_id | view_name | view_id } [ , index_name | index_id ] ) ] [ WITH {
ALL_INDEXES | FAST [ , ALL_INDEXES ] | TABLERESULTS [ , { ALL_INDEXES } ] [ , { FAST | ALL_LEVELS } ]}
]
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 25 -
Wykrywanie fragmentacjiWykrywanie fragmentacji
Polecenie DBCC SHOWCONTIGOpcje polecenia
FAST – skanowanie będzie szybsze, ale pobrana będzie mniejsza ilość informacjiALL_LEVELS
dualne do FASTwyciąga wszystkie informacje
TABLERESULTS – wyniki będą w postaci tabeli wraz z dodatkowymi informacjamiALL_INDEXES – informacje będą o wszystkich indexach niezależnie, czy został wybrany konkretny index
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 26 -
Wykrywanie fragmentacjiWykrywanie fragmentacji
Znaczenie pozycji wyniku polecenie DBCCPage scanned – liczba stron w indeksieExtents scanned – liczba obszarów w indeksieExtent switches – liczba przejść między obszarami przy przeglądaniu kolejnych stron indeksuAvg. pages per extent – liczba stron w obszarze w ramach łańcucha stronScan density [best count:actual count]
best count – optymalna liczba obszarówactual count – bieżąca liczba obszarów
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 27 -
Wykrywanie fragmentacjiWykrywanie fragmentacji
Znaczenie pozycji wyniku polecenie DBCCLogical scan fragmentation – procent stron dla których logiczna kolejność nie przenosi się na kolejność liści w drzewieExtent scan fragmentation – stosunek liczb luk pomiędzy obszarami, a liczbą obszarów
obszar jest identyfikowany przez pierwszej jego stronynp. kolejne obszary indeksu to 8, 16, 24 i 40, zatem luka jest pomiędzy 24 i 40.ponieważ liczba luk jest max. liczba obszarów-1, współczynnik nie osiąga nigdy 100%
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 28 -
Wykrywanie fragmentacjiWykrywanie fragmentacji
Znaczenie pozycji wyniku polecenie DBCCDo wyznaczenia stopnia fragmentacji najbardziej odpowiednie są parametry:
Logical scan fragmentationExtent scan fragmentation
I w trochę mniejszym stopniu:Scan density
w przypadku, gdy tabela jest oparta na kilku plikach, parametr ten przestaje być wiarygodny
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 29 -
Pozbywanie się fragmentacjiPozbywanie się fragmentacji
Sposób 1: przebudowaniePrzykładowe sposoby przebudowania
wykonać DROP INDEX i CREATE INDEXCREATE INDEX z opcją DROP EXISTING
Pomijając inne wady, podstawowa jest taka, że na tabele są nakładane blokady i stają się one częściowo lub w ogóle niedostępneJeśli indeks ma wysoki stopień fragmentacji, ta metoda jest stosunkowo najszybsza
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 30 -
Pozbywanie się fragmentacjiPozbywanie się fragmentacji
Sposób 2: defragmentacjaSłuży do tego polecenie DBCC INDEXDEFRAGSkładnia
DBCC INDEXDEFRAG( { database_name | database_id | 0 } , { table_name | table_id | 'view_name' | view_id } , { index_name | index_id } ) [ WITH NO_INFOMSGS ]
OpcjePodając bazę o numerze 0, podajemy bazę bieżącąNO_INFOMSGS – wyłącza generowanie komunikatów o wadze 0 do 10 (informacyjnych)
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 31 -
PrzykładPrzykład
sqlserver-p07-04.sql
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 31 -
Zbieranie informacji do statystykZbieranie informacji do statystyk
Przeglądanie wszystkich lub losowo wybranych wartości w kolumnachPrzeglądanie losowej próbki jest domyślne przy
tworzeniu i aktualizacji statystykPrzeglądanie wszystkich wierszy jest domyślne
przy tworzeniu indexówprzy użyciu opcji FULLSCAN podczas tworzeniu lub aktualizacji
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 32 -
Tworzenie statystykTworzenie statystyk
AutomatyczneJeśli opcja bazy danych auto create statistics jest ustawiona na ON, automatycznie są tworzone statystyki dla
indeksowanych kolumn zawierających danenieindeksowanych kolumn używanych w złączeniach klauzuli where
Wyłączenie tej opcji może źle wpłynąć na wydajność, gdyż wtedy optymalizator kwerend nie będzie mógł z nich korzystać
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 32 -
Tworzenie statystykTworzenie statystyk
RęczneStatystyki tworzymy za pomocą polecenia
CREATE STATISTICS statistics_name ON {table| view} (column [,...n])
Statystyki można utworzyć dlanieindeksowanych kolumnwszystkich kolumn poza pierwszą indeksu złożonegodla kolumn wyliczanych, ale takich, dla których można by utworzyć indeks (czyli spełniających pewne warunki)kolumn nie opartych na typach text, ntext, image
Tworzenie takich statystyk może być przydatne dla optymalizatora kwerend wtedy, gdy nie chcemy tworzyć indeksu
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 33 -
Odświeżanie statystykOdświeżanie statystyk
Jest to ważne, ponieważ przy nieaktualnych danych optymalizator kwerend może działać nieoptymalnieAutomatyczne
ma miejsce, gdy jest włączona opcja auto update statisticsaktualizacja jest wykonywana przy optymalizacji zapytań przez optymalizator kwerend
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 34 -
Odświeżanie statystykOdświeżanie statystyk
RęczneRęcznemożna wywołać poleceniem
UPDATE STATISTICS table| view [index | (statistics_name[,...n])]
należy je wykonać w następujących sytuacjachkiedy utworzymy indeks przed wstawieniem danych do tabelikiedy tabela jest obcięta (truncate)kiedy wstawiamy dużo wierszy do tabeli (szczególnie z małą ilością danych) i zamierzamy od razu wykorzystywać ją w zapytaniach
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 35 -
Wyświetlanie statystykWyświetlanie statystyk
Wyświetlamy statystyki za pomocą polecenia DBCC SHOW_STATISTICS
SkładniaDBCC SHOW_STATISTICS (table, target)
Opcjetarget – czego statystyki chcemy wyświetlić
nazwa indeksunazwa statystyki
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
PrzykładPrzykład
sqlserver-p07-05.sql
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
Indeksowanie widokówIndeksowanie widokówIndeksowanie widoków odpowiada widokom zmaterializowanymPierwszym indeksem musi być unikalny indeks zgrupowanyPodobnie jak w przypadku indeksów na kolumnach wyliczeniowych należy ustawić następujące opcje
SET ANSI_NULLS ON, SET ANSI_PADDING ONSET ANSI_WARNINGS ON, SET ARITHABORT ONSET CONCAT_NULL_YIELDS_NULL ONSET QUOTED_IDENTIFIER ONSET NUMERIC_ROUNDABORT OFF
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
Indeksowanie widokówIndeksowanie widoków
Definicja widoku, który ma być indeksowany nie może zawierać
słów TOP, DISTINCT, UNIONkolumn typu text, ntext, imagefunkcji MIN, MAX, COUNT(*), COUNT(wyr), AVG ...innego widoku (tylko tabele bazowe)klauzul COMPUTE, COMPUTE BYklauzuli ORDER BY...
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
Indeksowanie widokówIndeksowanie widoków
W przypadku, gdy chcemy użyć GROUP BY, na liście select należy użyć funkcji COUNT_BIG(*)GROUP BY nie może mieć klauzuli HAVINGFakt, czy widok jest indeksowalny można sprawdzić za pomocą właściwości IsIndexable funkcji OBJECTPROPERTYWidok musi być utworzony z opcją SCHEMABINDING – zapobiega to usunięciu tabel bazowych dla widoku
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
Indeksowanie widokówIndeksowanie widoków
Wykorzystanie indeksów na widokachkwerenda nie musi się bezpośrednio odwoływać do widok, żeby skorzystać z indeksu utworzonego dla tego widoku
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -
PrzykładPrzykład
sqlserver-p07-06.sql
Microsoft SQL Server 2000 Copyright © Paweł Rajba- 36 -