Con l'aumentare dei dati, un database (in fase di ricerca delle informazioni), tende a degradare le sue prestazioni. Questa è una conseguenza naturale, maggiori sono i dati da gestire e maggiori sono i tempi della gestione. Per tali ragioni è necessario verificare che le nostre query siano ottimizzate in modo da non contribuire (con delle interrogazioni mal fatte), ad inutili sovraccarichi del server. Infatti viene realizzato di un server di dati affinché più persone contemporaneamente possano usufruirne. Quindi, quando i dati sono molti e le nostre query sono lente, maggiori sono gli utenti che le lanceranno e maggiore sarà il contributo che daranno al degrado delle prestazioni del server. Per questa ragione è bene verificare che le nostre query siano ottimizzate. Non ho intenzione di parlare su come ottimizzare le query o le tabella del DB, piuttosto di indicare quali siano i comandi transact-sql da utilizzare per monitorare la situazione e fare le opportune considerazioni.
Qui sotto elenco una breve descrizione di 4 comandi che possono essere utili al nostro intento:- SET STATISTICS IO
- SET STATISTICS TIME
- DBCC SHOW_STATISTICS
- DBCC SHOWCONTIG
SET STATISTICS IO
Quando l'istruzione STATISTICS IO è impostata su "ON", vengono visualizzate informazioni statistiche relative all'utilizzo del disco durante l'esecuzione delle query. Ovviamente qualora si voglia indicare al server che le statistiche non sono più necessarie basterà impostare l'istruzione su "OFF". Un esempio del suo utilizzo potrebbe essere il seguente
SET STATISTICS IO ONNel riepilogo presentato si osservano i seguenti dati:
--SCRIVERE LE ISTRUZIONI SQL CHE SI DESIDERANO
select * from tabella
SET STATISTICS IO OFF
- Nome tabella
- Scan Count - Numero della scansioni eseguite sulla tabella
- Logical reads - Numero delle pagine lette dalla cache di dati.
- Physical reads - Numero della pagine lette dal disco
- Read-ahead reads - Numero delle pagine inserite nella cache
- Lob logical reads - Numero pagine lette dalla cache per il tipo dati text, ntext, image o per tipi dati di grandi dimensioni
- Lob physical reads - Numero pagine lette dal disco per il tipo dati text, ntext, image o per tipi dati di grandi dimensioni
- Lob read-ahead reads - Numero pagine inserite nella cache per il tipo dati text, ntext, image o per tipi dati di grandi dimensioni
Ovviamente le informazioni inerenti agli accessi sul disco sono quelle più rilevanti ai fine di ottenere migliori prestazioni con le query. Maggiori saranno i valori riportati per gli accessi fisici al disco, maggiore sarà il tempo impiegato per l'esecuzione dei comandi SQL.
Anche se queste informazioni potrebbero essere viziate dal carico presente sul server sono comunque indicative sullo suo stato di reattività. Prima di formulare ipotesi roboanti su come migliorare la velocità di risposta del server, dovremmo analizzare le query stesse per vedere se potrebbero essere migliorate per creare un minore carico e quindi avere maggiore velocità.
SET STATISTICS TIME
Un'altro modo per monitorare l'esecuzione delle richieste al server, consiste nel visualizza il tempo di esecuzione delle query. L'struzione STATISTICS TIME permette di visualizzare il tempo di esecuzione (espresso in millisecondi), di l'analisi e di compilazione di ogni istruzione. Viene attivata come l'istruzione STATISTICS IO e un breve esempio è riportato qui sotto:
SET STATISTICS TIME ONIl Report riepologativo che viene presentato dopo l'esecuzione del codice Transact-SQL è di facile comprensione e non necessita di spegazioni.
--SCRIVERE LE ISTRUZIONI SQL CHE SI DESIDERANO
select * from tabella
SET STATISTICS TIME OFF
DBCC SHOW_STATISTICS
Questa istruzione permette di avere un ventagglio di informazioni abbastanza ampio in merito a dati statistici riferiti ad un indice di una determinata tabella. La sintassi è la seguente:
DBCC SHOW_STATISTICS (nome_tabella, nome_indice)Le statistiche restituite sono specificate di seguito:
| Valori restituiti | Descrizione |
|---|---|
| Update | Data e ora dell'ultimo aggiornamento delle statistiche. |
| Rows | Numero di righe nella tabella. |
| Rows Sampled | Numero di righe campionate per le informazioni statistiche. |
| Steps | Numero di passaggi di distribuzione. |
| Density | Selettività del prefisso della prima colonna dell'indice (non frequente). |
| Average key length | Lunghezza media di tutte le colonne dell'indice. |
| String Index | Indica che le statistiche contengono un indice di riepilogo delle stringhe per supportare la stima delle dimensioni del set di risultati per condizioni LIKE. Si applica solo alle colonne iniziali con tipo di dati char, varchar, nchar, nvarchar, varchar(max), nvarchar(max), text e ntext. |
| All density | Selettività di un set di prefissi di colonne dell'indice (frequente). |
| Average length | Lunghezza media di un set di prefissi di colonne dell'indice. |
| Columns | Nomi dei prefissi delle colonne dell'indice per cui sono visualizzati i valori All density e Average length. |
| RANGE_HI_KEY | Valore limite superiore di un intervallo dell'istogramma. |
| RANGE_ROWS | Numero stimato di righe della tabella che rientrano in un intervallo dell'istogramma, escluso il limite superiore. |
| EQ_ROWS | Numero stimato di righe della tabella con valore uguale al limite superiore dell'intervallo dell'istogramma. |
| DISTINCT_RANGE_ROWS | Numero stimato di valori distinct in un intervallo dell'istogramma, escluso il limite superiore. |
| AVG_RANGE_ROWS | Numero medio di valori duplicati in un intervallo dell'istogramma, escluso il limite superiore (RANGE_ROWS / DISTINCT_RANGE_ROWS per DISTINCT_RANGE_ROWS > 0). |
DBCC SHOWCONTIG
Questo comando presenta alcuni limiti su SQL Server 2005 in quanto ci sono ovviamente delle differenze fra quella versione e la precedente. Dalle versioni successive a SQL Server 2005, questo comando non sarà più presente e verrà sostituito da questa vista di sistema: sys.dm_db_index_physical_stats. Per avere maggiori informazioni su questa vista è meglio consultare la guida in linea.
Lo scopo di questo comando è quello di verificare il livello di frammentazione di una tabella. Infatti, anche le tabelle, in seguito a ripetute operazioni di modifica dei dati, organizzano le informazioni in modo non omogeneo. La frammentazione dei dati causa ovvi ritardi nella restituzione dei records elaborati nelle query. Per vedere lo stato di saluti di una specifica tabella si usa questo comando “DBCC SHOWCONTIG(nome_tabella [, nome_indice | id_indice])”. Le statistiche presentate nel risultato riportano le seguenti informazioni:
| Pagine sottoposte a scansione | Numero di pagine della tabella o dell'indice, qualora si sia specificato anche l'indice |
| Extent sottoposti a scansione | Numero di extent della tabella o dell'indice. |
| Cambi di extent | Numero di passaggi dell'istruzione DBCC da un extent all'altro durante l'attraversamento delle pagine della tabella o dell'indice. |
| Media pagine per extent | Numero di pagine per extent nella catena di pagine. |
| Densità di scansione [conteggio ottimale:conteggio effettivo] | Valore percentuale. Rapporto tra Conteggio ottimale e Conteggio effettivo. Questo valore è 100 se tutti gli elementi sono contigui, è minore di 100 in presenza di frammentazioni. Conteggio ottimale rappresenta il numero ideale di cambi di extent se tutti gli elementi fossero contigui. Conteggio effettivo rappresenta il numero effettivo di cambi di extent. |
| Frammentazione scansione logica | Percentuale di pagine non ordinate restituite dalla scansione delle pagine. |
| Frammentazione scansione extent | Percentuale di extent non ordinati rilevati durante la scansione delle pagine di un indice. |
| Media byte disponibili per pagina | Numero medio di byte disponibili nelle pagine sottoposte a scansione. Maggiore è questo numero, minore è il livello di riempimento delle pagine. I numeri minori indicano una situazione migliore. Anche le dimensioni delle righe influiscono su questo valore, che risulta maggiore per righe di grandi dimensioni. |
| Media densità pagina (completa) | Densità media della pagina, in percentuale. Questo valore tiene conto delle dimensioni delle righe e pertanto rappresenta un'indicazione più precisa dell'effettivo livello di riempimento delle pagine. Sono preferibili valori elevati. |
NOTA: Parte delle informazioni presenti in questo articolo sono state prese dalla documentazione in linea di MS SQL Server 2005






