implementacja indeksów i statystyk
TRANSCRIPT
2
Maciej Szczerkowski• Projektant / programista baz danych
• Microsoft SQL Server 2000, 2005, 2008
• Firebird 2.1, 2.5• Programista
• C/C++• VBA• C#
• Zainteresowania• Programowanie / bazy danych• Film• Fotografia / grafika komputerowa• Science-fiction
1999
2000
2001
2006
2009
2010
3
Agenda
• Organizacja danych w MS SQL Server• Indeksy
• Clustered• Nonclustered• Widoki indeksowane
• Search ARGuments• Statystyki
4
Fizyczna organizacja danych
Exte
nt
Page
.mdf
.ndf
dat
a fil
es
Row
s
Prim
ary
File
Grou
p | .
ldf l
og
files
Baza
dan
ych
8 sąsiadujących stron (8 KB każda)Kiedy extent jest pełny, następny rekord „zajmuje” cały kolejny extent
8 KBLiczba rekordów / stronę zależy od wielkości (bajt) / rekordKiedy storna jest pełna następuje podział:•Nowa strona jest alokowana: ½ danych ze starej storny przesuwana na nową stronę
8060 bajtów i 1024 kolumny
5
Logiczna organizacja danych – Heap (sterta)• Index Allocation MAP (IAM)• Dane nie są uporządkowane• Określone rekordy nie mogą być szybko odczytane
(chyba że został zdefiniowany NonClustered index)• SQL Server skanuje całą stertę• Data pages nie są zorganizowane w listę > dostęp
do kolejnych stron za pośrednictwem Index Allocation Map (IAM)
• Brak Clustered Index • nie jest wymagany dodatkowy czas na
utrzymanie indeksu• nie jest wymagane dodatkowe miejsce na
przechowywanie drzewa Clustered Index• Tabela posiada wartość Index_id = 0 w widoku
sys.indexes
6
Logiczna organizacja danych – Clustered index• Tabela jako zrównoważone drzewo binarne
• Korzeń drzewa zawiera klucz indeksu• Dane przechowywane na liściach drzewa / data pages• Data pages uporządkowane jako lista dwukierunkowa
• Dane logicznie uporządkowane zgodnie z definicją CREATE INDEX
• Szybki dostęp do danych z wykorzystaniem kolumn tworzących indeks
• Dodatkowy czas wymagany do utrzymania indeksu podczas operacji INSERT, UPDATE, DELETE
• Dodatkowa przestrzeń wymagana do przechowywania drzewa Clustered Index
• Tabela posiada wartość Index_id = 1 w widoku sys.indexes
• Tylko jeden indeks Clustered na tabelę• Tworzony automatycznie podczas definicji PK lub
UNIQUE
7
Logiczna organizacja danych – NonClustered Index
• Indeks NonClustered tworzy drzewo binarne• Korzeń drzewa zawiera klucz
indeksu• Strony indeksu są kopią danych z
tabeli• Liście indeksu zawierają wskaźniki
do tabeli źródłowej:• Na klucz indeksu clustered, lub• Row locator sterty
• Columnstore index
8
Widoki indeksowane
• SQL Server odczytuje wcześniej zagregowane dane
• Widok indeksowany posiada wiele ograniczeń
• https://msdn.microsoft.com/en-us/library/ms191432%28v=sql.110%29.aspx
• Możliwości Enterprise Edition
9
CREATE INDEX
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WHERE <filter_predicate> ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name ) | filegroup_name | default } ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
[ ; ]
<relational_index_option> ::={ PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | DROP_EXISTING = { ON | OFF } | ONLINE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism | DATA_COMPRESSION = { NONE | ROW | PAGE} [ ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ]}
10
Search ARGuments
• Zapytanie muszą być wystarczająco selektywne
• SQL Server (zawsze) wykorzysta indeks obejmujący zapytanie
• NonCovering Idx Seek przy selektywności poniżej 1%
• SQL Server estymuje selektywność na podstawie statystyk
• SARG
• Unikamy negacji w klauzuli WHERE
• Kolumna po jednej stronie wyrażenia
11
Kolejność kolumn ma znaczenie
• Indeks ON (ColA, ColB) nie jest taki sam jak ON (ColB, ColA)
• Indeks POC
• Partitioning (klauzula GROUP BY)
• Ordering (klauzula ORDER BY)
• Covering (klauzula SELECT)
12
Realizacja zapytania
KompilacjaOptymalizacja zapytania
• Indeksy• Struktura fizyczna i
logiczna• Zbuforowane plany
zapytania• Ilość wierszy
(STATYSTYKI)
Standaryzacja zapytania
Parsowanie zapytania
13
Statystyki
• Statystyki przechowują informacje o liczbie wierszy [biorących udział w zapytaniu]
• DBCC SHOW_STATISTICS
• Automatyczna aktualiacja statystyk
• AUTO_CREATE_STATISTICS
• AUTO_UPDATE_STATISTICS
• AUTO_UPDATE_STATISTICS_ASYNC
• Manualna aktualizacja statystyk
15
Podsumowanie
• Tabela może zawierać TYLKO jeden Clustered Index – zakładajmy go [świadomie]
• Indeks NonClustered powinien być zakładany na kolumnach o wysokiej selektywności
• SELECT czerpie korzyści z indeksów ale (zazwyczaj) kosztem CREATE, UPDATE, DELETE
• Indeksy NonClustered denormalizują bazę danych i zajmują dodatkowe miejsce
• Statystyki są niezbędne do poprawnego wykorzystania indeksów
• SQL Server sam dba o statystyki ale czasami trzeba mu pomóc
16
Więcej wiedzy
• Itzik Ben-Gan, Dejan Sarka, and Ron Talmage. Training Kit (Exam 70-461): Querying Microsoft® SQL Server® 2012
• SQLDay 2014 | track1 | Marcin Szeliga - Denormalizacja za pomocą indeksów
• https://msdn.microsoft.com/en-us/library/ms175049%28v=sql.110%29.aspx
• https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
• Demo na podstawie:
• http://www.jasonstrate.com/2013/06/my-teched-presentation-indexing-fundamentals-for-microsoft-sql-server/
17
Kontakt
email [[email protected]]
website [www.szczerkowski.com]
twitter [@mszczer]
linkedIn [http://pl.linkedin.com/in/maciejszczerkowski]
skype [maciek.szczerkowski]