Session in Italian language. Ogni database (relazionale e non) necessità di indici per poter fornire delle prestazioni ottimali. I database relazionali non scappano a questa regola ed, anzi, hanno nell'indicizzaione una grandissima opportunità per fornire prestazioni estreme. In questa sessioni vedremo i tipi di indici che abbiamo a disposizione, come si usano e come NON si usano e come possono migliorare le performance delle applicazioni.
4. #sqlsatPordenone
#sqlsat367February 28, 2015
Davide Mauri
20 Years of experience on the SQL Server Platform
Specialized in Data Solution Architecture, Database
Design, Performance Tuning, Business Intelligence
Projects, Consulting, Mentoring & Training
Regular Speaker @ SQL Server events
Microsoft SQL Server MVP
President of UGISS (Italian SQL Server UG)
Mentor @ SolidQ
Find me here:
Blog: http://sqlblog.com/blogs/davide_mauri/default.aspx
Twitter: @mauridb
6. #sqlsatPordenone
#sqlsat367February 28, 2015
Dopo il modello dei dati sono gli strumenti che
– utilizzati in modo corretto - permettono di
ottenere le performance più alte!
Perché una sessione sugli indici?
7. #sqlsatPordenone
#sqlsat367February 28, 2015
Indici e chiavi
Primary key
Insieme (minimo) delle colonne che permettono
l’identificazione univoca di una riga tra tutte le
altre
Foreign Key
Chiavi Primarie “migrate” in una tabella collegata
8. #sqlsatPordenone
#sqlsat367February 28, 2015
Indici e chiavi
Index keys
Insieme delle colonne che compongono l’indice
ATTENZIONE!
INDICI e CHIAVI (PK e FK) non hanno nulla in
comune!!!!!
Semplicemente – per motivi di performance – le
chiavi (PK e FK) usano gli indici.
9. #sqlsatPordenone
#sqlsat367February 28, 2015
Architettura dello storage
I dati presenti in tabelle (ed indici) sono
memorizzati in pagine
grosse circa 8Kb
L’unità di I/O più piccola per SQL Server è la
pagina
Le pagine sono raggruppate in extent
Extent = 8 pagine da 8 Kb
10. #sqlsatPordenone
#sqlsat367February 28, 2015
Tipi di indici
«Row-Store»
Clustered
Non-Clustered
Included Columns, Filtered Indexes
«Column-Store»
Clustered
Non-Clustered
«Beyond Relational»
XML / Full Text / Spatial / UDT
12. #sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Indexes
Le pagine non-foglia permettono di capire in
quali pagine sottostanti sta il dato che si sta
cercando
Le pagine foglia contengono i dati della tabella
L’indice cluster ordina “fisicamente” i dati
Un solo indice cluster per tabella
15. #sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
GRANDI DIFFERENZE con il cluster
Le pagine foglia NON contengono tutti i dati…
…ma solo i valori delle chiavi dell’indice
E’ una struttura dati separata
Quindi “pesa” e comporta un overhead
Le pagine foglia contengono dei puntatori alle
pagine dati della tabella
I puntatori sono diversi a seconda dell’esistenza o
meno di un indice cluster
16. #sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
I puntatori possono essere
Row Ids (se Heap)
Clustering Keys (se esiste indice cluster)
Ergo:
Gli indici non-cluster sono costruiti sull’indice
cluster
Nelle loro pagine foglia portano con se la
clustering key
17. #sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
Se indice cluster non univoco?
Univocità mantenuta in automatico da SQL…
…costa 4 byte per riga!
ATTENZIONE! Più è grande la chiave di
cluster….
…più spazio occupato nell’indice non cluster!
18. #sqlsatPordenone
#sqlsat367February 28, 2015
Non-Clustered (Row-Store) Indexes
Included Columns
Colonne i cui valori non sono indicizzati MA sono
inclusi nelle pagine foglia dell’indice
Permettono di migliorare le prestazioni di
ricerca e restituzione dati
«Indici di copertura»
Maggior spazio occupato
Maggior «fatica» nelle fasi di modifica
19. #sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Indice Cluster
Ordinamenti
Group by
Range Search
Insert
Se e solo se l’indice è costruito su valori sempre
crescenti
Assicura che le pagine dei dati siano i memoria
E se non avete *troppe* insert (>15000Batch/sec)
20. #sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Non Cluster (Row-Store)
Solo se altissima selettività
Selettività = righe interessate / righe totali
Overhead dato dall’operazione di “Bookmark
lookup”
Nell’execution-plan in SQL 2005 non è visibile
come operatore ad-hoc ma come join tra cluster
(o heap) e non-cluster
21. #sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Di Copertura
Indici di copertura (Covering Index)
Non-Cluster
“Misto” (Non-Cluster + Cluster)
Indici che, da solo, è in grado di soddisfare una
query
“Copre” tutti i campi della query
Prima chiave dell’indice = prima colonna nella
clausola where
Migliora di MOLTO le prestazioni in lettura!
22. #sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Di Copertura
Tramite le “Included Colums” è possible creare
indici di copertura più efficienti
Non metto tutte le colonne della query come chiavi
Metto solo quelle usate per ricerca i valori (WHERE,
GROUP BY)
Le colonne usate in SELECT … FROM le “includo”
Impatta solo sulle dimensioni delle pagine foglia
23. #sqlsatPordenone
#sqlsat367February 28, 2015
Column-Store Indexes
In-memory column-store index
La riga di dati viene decomposta nelle singole
colonne
Dati memorizzati in segmenti e dizionari
Source: http://dl.acm.org/citation.cfm?id=1989448
24. #sqlsatPordenone
#sqlsat367February 28, 2015
Column-Store Indexes
Permettono l’utilizzo di un nuovo modello di
esecuzione «batch mode execution»
Vector-Based Execution
Vettore di circa 1000 righe
Non è importante l’ordine delle colonne
E’ una buona idea mettere TUTTE le colonne
nell’indice
Grossa differenza con i «row-store» indexes
25. #sqlsatPordenone
#sqlsat367February 28, 2015
Clustered Column-Store Index
Se usato è l’unico indice che può esistere
sulla tabella
Tutte le colonne della tabelle sono
automaticamente incluse
Supporta uno speciale livello di compression
chiamato “Archivial”
Utilizza un ulteriore tipo di file «Delta Store»
per gestire le modifiche ai dati
27. #sqlsatPordenone
#sqlsat367February 28, 2015
Utilizzo: Column-Store Indexes
Tipicamente in un Data Warehouse / Data
Mart
Oppure soluzione DSS (Decision Support
System)
Ideale con uno Star Schema
Ideale per query con group by
29. #sqlsatPordenone
#sqlsat367February 28, 2015
Performance Considerations
Obbiettivo: abbassare il più possibile le
operazioni di I/O
In lettura
In scrittura
Tanti indici
(potenzialmente) più velocità in lettura
(sicuramente) meno velocità in scrittura
30. #sqlsatPordenone
#sqlsat367February 28, 2015
Performance Considerations
Regola Aurea per OLTP
POCHI MA BUONI
Regola Aurea per OLAP
Tanti quanti ve ne servono, tanto il caricamento è
one-shot
A meno che non dobbiate fare Real-Time BI
Allora: Ottimo Hardware e, se possibile, Column Store
31. #sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
Possibilità di VEDERE se per UNA query
mancano degli indici
XML SHOWPLAN
MissingIndexesStatistics
DMVs:
sys.dm_db_missing_index_*
Altre DMVs & DMFs molto Utili
sys.indexes & sys.indexes_columns
sys.dm_db_index_usage_stats
sys.dm_db_index_physical_stats()
32. #sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
Serve TEMPO e PAZIENZA
Analisi I/O, TIME, Execution Plans, Cardinality
Estimation
Oltre che un ambiente di TEST il più possibile
uguale a quello di produzione
Le performance dell’I/O sono determinanti
33. #sqlsatPordenone
#sqlsat367February 28, 2015
Query Tuning
Occhio alle stored procedure
Se i dati sono molto disomogenei come
distribuzione valutare l’uso di WITH RECOMPILE
In alcuni casi (UPDATE/DELETE) gli indici
aiutano a diminuire le dimensione dei lock!
34. #sqlsatPordenone
#sqlsat367February 28, 2015
Di cosa non abbiamo parlato
XTP HASH & BW-TREE (RANGE) INDEX
Indexes DMVS
Usage
Physical & Operational Info
Missing Indexes
http://sys2dmvs.codeplex.com/
https://sqlserverperformance.wordpress.com/