Che cosa sono le statistiche del database e come posso trarne vantaggio?


18

Ho sentito parlare delle statistiche che SQL Server conserva per impostazione predefinita. Cosa stanno monitorando e come posso usare queste informazioni per migliorare il mio database?

Risposte:


21

Le statistiche sono semplicemente una forma di metadati dinamici che aiutano l'ottimizzatore di query a prendere decisioni migliori. Ad esempio, se ci sono solo una dozzina di righe in una tabella, allora non ha senso andare a un indice per fare una ricerca; starai sempre meglio facendo una scansione della tabella completa. Ma se quella stessa tabella cresce fino a un milione di righe, probabilmente starai meglio usando l'indice. Ma se interroghi quella tabella su una colonna che ha solo pochi valori univoci (ad esempio potrebbe essere una colonna "sesso" contenente solo "M" o "F"), in realtà un FTS potrebbe essere migliore di quel caso perché è necessario recuperare comunque il blocco per creare il set di risultati. Ora supponiamo che la tua tabella sia al 99% "M" e solo all'1% "F", dovremmo FTS in un caso o usare un indice nell'altro. Stessa tabella, stessa query, potenzialmente quattro piani di query diversi a seconda del contenuto della tabella. Questi tipi di cose sono le "statistiche" e sono individuali per ciascun database - anche due database con identica tabella e struttura di indici avranno statistiche diverse.

In breve, in un moderno motore di database ci sono due tipi di ottimizzazione delle query: riscrivere l'SQL (ottimizzazione basata su regole, come un compilatore riscrive la tua C per renderla più efficiente) e scegliere il giusto percorso dei dati (ottimizzazione basata sui costi , come un compilatore JIT che identifica gli hotspot in fase di esecuzione). Devi preoccuparti di questo solo se noti che Query Optimizer sta facendo qualcosa di ovviamente sbagliato (ad esempio, scegliendo FTS quando sai che un indice sarebbe meglio).


2
+1 Non avrei potuto spiegarlo meglio. È importante ricordare che le statistiche sono utili solo se aggiornate. Questo può essere fatto con le statistiche di aggiornamento automatico o con un comando di statistiche di aggiornamento programmato regolarmente (ogni notte / settimana). Inoltre, le ricostruzioni dell'indice eseguiranno automaticamente un aggiornamento delle statistiche.
Matt M

5

Sono utilizzati da Query Optimizer (white paper su MSDN) per tenere traccia della distribuzione dei valori negli indici e / o nelle colonne.

La tua unica preoccupazione dovrebbe essere l' aggiornamento periodico : lascia il motore DB per fare le sue cose


2
Non sempre. Ci sono momenti in cui la creazione manuale di una statistica può aiutare a migliorare le prestazioni della query.
mrdenny,

@mrdenny: Quanto spesso l'hai fatto nella vita reale? Molto raramente. Non ho IIRC. Se ha bisogno di statistiche si potrebbe sostenere che ha bisogno di un indice, che ha comunque statistiche. È possibile creare solo statistiche di colonna secondo CREATE STATISTICS . Dato che OP ha dovuto chiedere delle statistiche, direi che è una cosa giusta da fare.
gbn

1
L'ho fatto un paio di volte, ma non spesso. Stavo andando contro la tua affermazione "La tua unica preoccupazione dovrebbe essere quella di aggiornare regolarmente", poiché l'aggiornamento delle statistiche non è l'unica cosa.
mrdenny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.