implementacja indeksów i statystyk

17
Implementacja indeksów i statystyk Training Kit (Exam 70-461): Querying Microsoft® SQL Server® 2012

Upload: maciej-szczerkowski

Post on 11-Jan-2017

301 views

Category:

Software


0 download

TRANSCRIPT

Implementacja indeksów i statystykTraining Kit (Exam 70-461): Querying Microsoft® SQL Server® 2012

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

14

Demo

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]