giovedì 10 novembre 2011

Perchè non SQL Server aggiornare le statistiche in tempo reale?

Domanda di questa settimana viene da uno dei partecipanti di SqlConnections che ha chiesto questo durante il nostro "Follow the Rabbit - Q & A" sessione con cui Paolo e ho sempre terminare la conferenza.
Domanda: Perché non è possibile eseguire SQL Server "in linea" le statistiche gli aggiornamenti - in sostanza, le statistiche di aggiornamento "al volo" e come le modifiche dei dati?
Risposta: Questa è una domanda grande e uno che è meglio spiegato da espandendo la struttura interna di un blob statistiche. SQL Server memorizza le statistiche in 3 parti: l'intestazione statistiche, il vettore densità e l'istogramma. L'intestazione statistica ha di base (ma molto utile) dettagli come l'ultima volta che sono stati aggiornati i dati statistici (colonna: Aggiornato), il numero di righe della tabella (colonna: Righe) vs il numero di righe utilizzate per generare le informazioni statistiche (colonna: righe campionate) e alcuni articoli di altri, come il numero di passi nell'istogramma (colonna: Passi). E 'scritto nella "numero di passi", dove si ottiene qualche informazione su come SQL Server è in grado di memorizzare le informazioni "sommario".
Per essere efficaci, le statistiche devono essere relativamente piccole. Se una statistica rappresentato ogni valore dei dati che potrebbe finire per essere grandi (forse grande come i dati) e molto costoso da leggere e gestire. Se le statistiche erano grandi come i dati, allora sarebbe più veloce per leggere i dati e non solo preoccuparsi di una statistica sui dati. Il risultato finale sarebbe che le statistiche sarebbe inutile a causa del costo. Di conseguenza, SQL Server utilizza l'istogramma per memorizzare i reali valori dei dati, ma non ogni valore può essere rappresentato. Per una serie di motivi, SQL Server limita il numero di "passi" a 200 valori distinti reali dalla prima colonna della chiave più 1 fila per rappresentare valori nulli - se la prima colonna consente valori Null. Ciò significa che un istogramma può avere fino ad un massimo di 201 gradini.
E 'in questo istogramma (e come funziona) dove posso spiegare l'assoluta impossibilità per "on the fly" aggiornamenti. Ogni fase ha un valore reale di dati, ma per aiutare la statistica ad essere ancora più utile a SQL Server, ogni passo ha anche informazioni sui dati riscontrati in questo passo. Per spiegare questo ho intenzione di usare un esempio reale dal database "Credito" del campione. Questo è quello che molti di noi usano negli esempi messa a punto e si può scaricare un SQL Server 2000 o 2008 versione dalla nostra pagina risorse qui: http://www.sqlskills.com/PastConferences.asp . In questo database c'è una tabella chiamata membri e dispone di 3 indici: uno indici cluster e due cluster. Vorrei spiegare l'istogramma nel contesto di uno degli indici non cluster: member_corporation_link.
Questo indice member_corporation_link è stato definito come segue:
CREATE INDEX NONCLUSTERED [member_corporation_link]      ON [dbo]. [membro] ([corp_no])

In primo luogo, per vedere una statistica - è necessario utilizzare DBCC SHOW_STATISTICS.
DBCC SHOW_STATISTICS ( table_name , index_or_statistics_name )
Statistiche di intestazione
NomeAggiornatoRigheRighe campionatePassi* ...
member_corporation_link26 Agosto 2008 05:181000010000201* ...
* C'è di più le informazioni fornite, ma non direttamente pertinenti a questo articolo / discussione.
Densità Vector
Tutte le densitàLunghezza mediaColonne
0,00250,6008corp_no
0,00014,6008corp_no, member_no
C'è molto al vettore densità ma non è pertinente a questa domanda / esempio.
Istogramma
**RANGE_HI_KEYRANGE_ROWSEQ_ROWSDISTINCT_RANGE_ROWSAVG_RANGE_ROWS
1NULL0849801
250101
3335251
...
1374020801
1384030401
13840714527
1404080701
...
2004990701
2015000801
** In questa colonna non esiste nell'istogramma. Si aggiunge qui in modo che si può vedere cosa righe - e quante righe - sono stati rimossi per ridurre l'output mostrato.
Comprendere una statistica
Nell'output di SHOW_STATISTICS, si può vedere che questa tabella particolare ha 10.000 righe con tutti i 10.000 essendo stati campionati per la generazione delle statistiche (questa informazione è da statistics_header). Si può anche vedere che ci sono 201 passi nell'istogramma. Si può vedere in due modi - Passi (nell'intestazione statistiche) e come il numero di righe nell'istogramma.
Il modo di leggere un istogramma è la seguente. Se la seguente query dovesse essere eseguito:
SELECT * FROM membri DOVE corp_no = 403
Poi, SQL Server potrebbe usare l'istogramma per determinare il numero di righe che corrispondono. In questo caso, il numero fornito (403) è in realtà nell'istogramma. Di conseguenza, SQL Server stime 4 righe (dalla colonna EQ_ROWS). Tuttavia, se la seguente query dovesse essere eseguita, la "stima" è gestito in modo diverso perché il valore non è un passo specifico, ma piuttosto un membro di un passo.
SELECT * FROM membri DOVE corp_no = 404
Per questa query, la stima sarebbe 7. Questo valore deriva dalla lettura del passo mostrato per il valore di 407.Il modo di leggere il passo è che ci sono 14 righe tra 403 e 407 (esclusi quelli di 403 e 407) e all'interno di questa gamma ci sono 2 valori distinti nel campo (colonna: DISTINCT_RANGE_ROWS). Pertanto, il numero medio di righe per ogni valore all'interno di questo intervallo sarebbe 7 (colonna: AVG_RANGE_ROWS).
Tuttavia, è davvero così? Senza eseguire la query - non saprai. E, ai fini di questo post - non ha molta importanza. Tuttavia, è con questo esempio dove posso descrivere come "al volo" gli aggiornamenti sono impossibili!
Tra i valori di 403 e 407 ci sono 3 valori * * possibili. Tuttavia, questa tabella mostra attualmente solo le righe per 2 dei valori? Che due non è memorizzata all'interno della statistica, ma è noto solo al momento analizzato i dati. E, se una nuova riga sono state per entrare nel set con un valore di 404, come sarebbe la statistica essere aggiornato? È che una nuova riga per uno dei già "distinto" valori all'interno del campo facendo i numeri:
13840715527,5

O, è questo in realtà un nuovo valore all'interno della possibile distinti per questa gamma, rendendo i numeri:
13840715535

E 'impossibile per SQL Server in modo da riflettere accuratamente la vista "corrente" dei dati con un solo valore immesso. E, infatti, questa è la ragione per cui "al volo" aggiornamenti delle statistiche sono impossibili.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.