Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRaffaela Fedele Modificato 7 anni fa
1
Indici e statistiche: quanto e come incidono sull'efficienza dei nostri databases
Gilberto Zampatti
2
Sponsors
3
Organizers
4
Gilberto Zampatti RDBMS: ….dalle origini SQL Server: dalla 6.5
Mentore, trainer, Speaker… Membro fondatore di UGISS Social: Linkedin, Skype, Whatsapp
5
Agenda Indici (quali…perchè…)
Statistiche (internals e Cardinality Estimation)
6
Indici Indici mancanti (missing indexes)
7
IAM Header PFS GAM SGAM … … BCM DCM 13 7 35 21 49 97 68 71 123 40 55
201
8
Tabelle Heap Una tabella priva di clustered index è detta heap
Le pagine IAM contengono i puntatori alle extents in cui sono presenti pagine della tabella heap Le pagine IAM sono l’unica forma di collegamento tra le pagine di una tabella heap; le righe NON sono ordinate Le righe di una tabella Heap sono identificate da un row identifier (RID) Gli indici Nonclustered che insistono su una tabella heap contengono RID pointers
9
IAM Root Index Header PFS GAM SGAM … … BCM DCM 13 7 35 21 49 97 68 71
123 40 55 201 7 55 7 35 55 97 7 dati 13 … 21 … 35 … 40 … 49 55 68 71 97 123 201
10
Struttura degli indici
B(++)-trees (alberi fortemente bilanciati…): Struttura di dati ad albero invertito fortemente bilanciato Un nodo root; Molti nodi intermedi; molti nodi leaf (foglia) Chiave dell’indice: Combinazione di attributi della relazione (colonne della tabella) che determinano l’ordine dei dati
11
Architettura degli indici
Clustered index: Il nodo Root ed i nodi intermedi contengono pagine di indici; I nodi leaf contengono I DATI della tabella Ordine dell’indice = ordine dei dati della tabella La tabella è l’indice clustered Nonclustered index: Tutti i nodi contengono solo indici; Se la tabella è HEAP i puntatori sono RID Se la tabella è Clustered index i puntatori sono le chiavi dell’indice clustered I tipi di dato XML e spatial dispongono di indici “speciali”…
12
La …giusta chiave Criteri per un Clustered index :
Unique: non è un obbligo ma si evita l’aggiunta di un progressivo (integer) automatico Non-nullable: non è obbligatorio ma si evita l’overhead di un blocco di tre/quattro bytes per la gestione dei NULL Narrow (PICCOLO): non è obbligatorio, ma più è piccolo più si ridurrà l’IO su tutti gli indici Statico: non è obbligatorio, ma ogni aggiornamento si ripercuote sui tutti gli indici che lo referenziano Sequenzialmente progressivo (ever-increasing): se il modello dei dati lo consente, offre il doppio vantaggio di accelerare la propria scrittura e minimizzare la frammentazione
13
La …giusta chiave Criteri per un Nonclustered index :
Predicati usati con frequenza Colonne utilizzate nelle Join Queries di aggregazione
14
La …giusta chiave Evitare accuratamente:
Indici ridondanti e/o duplicati; Chiavi troppo complesse (e quindi troppo “lunghe”); Indici che soddisfano una sola query (specialmente in modelli di dati che subiscono molte modifiche)
15
La …giusta chiave Una sola colonna: Più colonne:
Ogni Colonna di un predicato dispone di un proprio indice Minor miglioramento delle prestazioni, ma elevata riusabilità Più colonne: Tutte le colonne dei predicati (…) sono incluse nella chiave dell’indice Massimo miglioramento delle prestazioni, ma minore riusabilità
16
Indici filtrati Nonclustered index con predicato di filtro:
Il filtro è definito mediante una clausola WHERE Prestazioni migliori ripetto a un indice “completo”: Miglior granularizzazione delle statistiche Minore dimensione Conviene quando i dati della tabella sono interrogati in subset chiaramente identificabili Ci sono alcune restrizioni: Non sono applicabili a viste Predicati di filtro semplici Funzioni di conversione solo sul lato destro del predicato
17
Le scelte dell’ottimizzatore
Metodi di accesso ai dati : Table scan Le pagine della tabella vengono lette filtrando le righe che rispettano il predicato Uso del Clustered index Navigazione verticale fino al livello foglia, poi accesso alle sole pagine le cui righe rispettano il predicato (seek o scan parziale) Uso del Nonclustered index su tabelle heap Navigazione verticale, seek o scansione parziale e poi “lookup” sulle righe della tabella mediante RID (Row IDentifier) Uso del Nonclustered index su Clustered indexes Navigazione verticale, seek o scansione parziale e poi accesso al clustered index mediante chiave
18
Covering Index SELECT c2, c4, c6, SUM(C8) FROM Tab1 WHERE c1 AND c3 GROUP BY c2, c4, c6 HAVING AVG(c5) ORDER BY c7, c9 DESC CREATE INDEX myIDX ON Tab1 (c3, c1) INCLUDE (c2, c4, c5, c6, c7, c8, c9)
19
Predicate SARGability
SARGability (Search ARGuments): WHERE <colonna> <operatore> <espressione> <Colonna> deve apparire in modo esplicito, “nativo” NON si deve includere il nome della colonna in una espressione (L’Ottimizzatore non sarebbe in grado di “vederla”) Se l’operatore è LIKE o NOT LIKE, l’uso di wildcards a destra del literal impedisce l’uso di indici sulla colonna esaminata
20
Predicate SARGability
SARGable Predicates WHERE LastName = N'Accah' WHERE 100 < BusinessEntityID WHERE ReorderPoint BETWEEN 250 AND 750 WHERE ModifiedDate = ' ' Non-SARGable Predicates WHERE LEFT(LastName,2) = N'Ac' WHERE 100 < ABS(BusinessEntityID) WHERE ReorderPoint BETWEEN 250 AND 750 WHERE CONVERT(varchar(20), ModifiedDate, 112) = ' '
21
Modifica dei dati DELETE: UPDATE: INSERT:
Le righe di riferimento alle chiavi sono rimosse dal livello foglia Una pagina vuota è rimossa dall’albero UPDATE: Una DELETE seguita da una INSERT INSERT: Una nuova riga viene aggiunta (nell’esatta posizione…): Nello spazio della pagina se sufficiente In una nuova pagina
22
61 Fragmentation!!! IAM Root Index Header PFS GAM SGAM … … BCM DCM 13
7 35 21 49 97 IAM 55 61 Root Index 68 71 123 40 55 201 7 55 7 35 55 97 61 Fragmentation!!! 7 dati 13 … 21 … 35 … 40 … 49 55 68 71 97 123 201
23
Indici mancanti Query Plans Query Store
Database Engine Tuning Advisor (!?... ) Missing index DMVs Nessuno strumento: Propone clustered indexes Propone modifiche ad indici esistenti Garantisce il corretto ordine delle colonne Propone Indici filtrati
24
Ordine delle colonne Efficienza della SELECT :
Solo la prima Colonna dispone di un histogram (tra poco…) Usare la Colonna più selettiva come prima colonna, pur considerando come sarà utilizzato l’indice Efficienza della INSERT : Considerare l’effetto che l’ordine delle colonne avrà sulla INSERT di righe in un clustered index multicolonna…
25
DEMO
26
Statistiche Statistiche Filtrate
27
Ottimizzazione basata sul costo
L’ottimizzatore sceglie tra i piani di esecuzione di una query quello che presenta il minor costo (Stimato) Le Statistiche sono elemento critico del processo di ottimizzazione basato sul costo Forniscono informazioni sulla distribuzione dei dati in una Colonna o in un gruppo di colonne Le Colonne di tabelle e indici dovrebbero disporre di statistiche …
28
Selettività dei Predicati
Espressioni che “restituiscono” uno di due possibili valori: true o false Sono espressi nelle clausole JOIN, WHERE ed HAVING Selettività dei Predicati È il numero di righe di una tabella per cui il predicato è true Alta Selettività = bassa percentuale di righe restituite dalla query Bassa Selettività = alta percentuale di righe restituite dalla query Nell’ottimizzazione della query La Selettività contribuisce all’ordinamento delle tabelle coinvolte in operazioni di join e alla scelta tra scan e seek
29
Cosa guardiamo delle Statistiche
Statistics header Metadati delle statistiche Density vector Metriche di univocità Histogram Distribuzione dei valori, su un istogramma fino a raggruppamenti DBCC SHOW_STATISTICS
30
Cosa guardiamo delle Statistiche
STAT_HEADER Name: nome dell’oggetto della statistica Updated: data e ora dell’ultimo aggiornamento Rows : numero delle righe dell’oggetto al momento del calcolo della statistica Rows Sampled : numerosità del sample usato dal calcolo Steps : numero degli intervalli dell’Istogramma Density : calcolata come 1 / distinct values dei valori della prima colonna della chiave, esclusi i valori degli estremi dell’intervallo
31
Cosa guardiamo delle Statistiche
DENSITY_VECTOR All Density: La densità è pari a 1 / distinct values; calcolata per ciascun raggruppamento (prefix) delle colonne incluse nell’oggetto Average Length: lunghezza media del raggruppamento di colonne Columns : nome delle colonne del raggruppamento
32
Cosa guardiamo delle Statistiche
HISTOGRAM RANGE_HI_KEY : valore della Colonna nella riga al limite superiore dell’intervallo RANGE_ROWS : numero stimato di righe presenti nell’intervallo, escluse quelle con valore pari a RANGE_HI_KEY EQ_ROWS : numero stimato di righe la cui colonna ha valore pari a RANGE_HI_KEY DISTINCT_RANGE_ROWS : numero stimato di valori distinti della colonna rientranti nell’intervallo, escludendo il valore RANGE_HI_KEY AVG_RANGE_ROWS : numero medio di duplicazioni presenti nell’intervallo escluse quelle in cui la colonna ha valore RANGE_HI_KEY (RANGE_ROWS / DISTINCT_RANGE_ROWS)
33
Stima della Cardinalità
In SQL Server, la stima della cardinalità tenta di predire il numero di righe restituite da una query o da un operatore della stessa In SQL Server 2014 e SQL Server 2016 la logica di stima della cardinalità è stata riscritta Molti I fattori che possono determinare risultati scarsamente …”fedeli” : Statistiche mancanti o scarsamente aggiornate Presenza di funzioni nei predicati Variabili di tipo tabella
34
Variabili di tipo tabella
Per queste variabili non sono presenti il density vector e l’istogramma della distribuzione Il numero di righe stimato è, per default, 1 (!!!) È preferibile, se possibile, l’uso di una tabella temporanea (detiene il set di statistiche al completo) OPTION RECOMPILE ripristina il numero di righe effettivo (ma costa…) Il Trace Flag 2453 attiva OPTION RECOMPILE quando il numero di righe della variabile cambia…
35
Creazione delle Statistiche
Creazione automatica : In presenza di AUTO_CREATE_STATISTICS = ON, sono create automaticamente quando mancano, per singole colonne incluse in predicati SOLO statistiche su Singole colonne… Prefisso _WA… Quando si crea un indice le statistiche relative sono SEMPRE create, a prescindere da AUTO_CREATE_STATISTICS Manualmente: CREATE STATISTICS sp_createstats
36
Aggiornamento delle Statistiche
Automatic update: AUTO_UPDATE_STATISTICS = ON L’aggiornamento è innescato durante la compilazione: Quando si aggiungono dati ad una tabella vuota… Quando la tabella ha non più di 500 righe al momento della creazione della statistica e se ne aggiungono più di 500… Quando la tabella ha più di 500 righe e se ne aggiungono (o tolgono) il 20% del numero originale… AUTO_UPDATE_STATS_ASYNC : Per default, mentre l’aggiornamento è in corso, la query che lo ha determinato attende; Se quest’opzione è attiva la query non attende.
37
Aggiornamento delle Statistiche
Aggiornamento manuale : Comando UPDATE STATISTICS, eseguibile su un singolo oggetto o su tutte le statistiche di una tabella o di una vista indicizzata sp_updatestats (wrapper che innesca UPDATE STATISTICS) L’aggiornamento delle statistiche determina la ricompilazione dei piani di esecuzione che referenziano gli oggetti aggiornati
38
Statistiche Filtrate Clausola WHERE applicata a un comando CREATE STATISTICS Limitazioni: AUTO_UPDATE_STATISTICS può “ignorarle” (meglio contare su UPDATE manuale…) Predicati limitati a logiche di confronto semplici Non possono essere create su computed columns, user defined data types, spatial data types o hierarchyId Non possono essere create su viste indicizzate Gli istogrammi di distribuzione dei valori sono meglio granularizzati
39
DEMO
40
Q&A Questions?
41
#sqlsat589 Thanks! Q&A
Presentazioni simili
© 2025 SlidePlayer.it Inc.
All rights reserved.