È possibile utilizzare una di queste due query per visualizzare le letture logiche totali e le letture fisiche totali.
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
Il primo lo suddivide per istruzione, il secondo conta nell'intera procedura.
Le letture fisiche vengono lette sul disco, le letture logiche sono contro la memoria. Puoi usarlo per capire quali procedure o istruzioni sono le più costose nel tuo sistema e provare a mettere a punto quelle.
Tieni presente che, mentre le letture logiche sono significativamente più economiche delle letture fisiche, sono comunque costose, quindi ridurne il numero (ad esempio aggiungendo un indice appropriato) può rendere le tue query molto più veloci.
Ci sono molte colonne aggiuntive nei DMV sopra che potresti trovare interessanti.
In che modo un indice aiuta a ridurre le letture logiche?
In SQL Server tutti i dati sono organizzati in blocchi, di dimensioni 8 KB. Questi blocchi sono chiamati "pagine".
Ogni tabella contiene pagine "meta" che contengono informazioni sullo struktur della tabella e pagine pata. Se non esiste alcun indice ed esegui una query come SELECT * FROM tbl WHERE Id = 7
SQL Server, devi cercare questa o queste righe nell'intera tabella. Quindi legge in una pagina alla volta, scorre attraverso tutte le righe di ciascuna pagina per determinare le righe che si adattano alla WHERE
clausola. Pertanto, se la tabella richiede l'archiviazione di 1.000.000 di pagine, l'esecuzione di questa query richiederà 1.000.000 di letture logiche.
Se si dispone di un indice, SQL Server ordina i dati in modo logico all'interno delle pagine e stabilisce un elenco collegato tra le pagine. Ciò consente di eseguire query con un ORDER BY
da eseguire senza un'operazione di ordinamento costosa. Ma soprattutto, l'ordinamento, SQL Server aggiunge un albero B + alla tabella. Un albero B + è una struttura paragonabile all'indice di un libro, in cui la ricerca di una parola chiave specifica mi consente di passare direttamente alla pagina che contiene la parola chiave. Il libro tipico ha solo un livello di indice mentre un albero B + può averne più. Basti pensare a un libro di grandi dimensioni, in cui l'indice stesso è lungo più pagine. In un caso del genere ha senso aggiungere un livello di indice aggiuntivo che ci dice su quale pagina si S
trovano le parole di indice che iniziano con .
Gli alberi B + sono ottimizzati per avere il minor numero possibile di livelli, fornendo al contempo la proprietà di poter trovare qualsiasi record nell'indice leggendo una pagina per livello di indice. Quindi supponi la WHERE Id = 7
query sopra quando hai un indice ordinato per Id
. Diciamo che l'indice ha 5 livelli. Ora, per trovare tutti i record che corrispondono a questa query, devo leggere una pagina per livello di indice (ovvero 5 pagine). Questo si chiama "Ricerca indice". Se ci sono più record che si adattano al conto, potrei dover seguire l'indice ordinato per un po 'per recuperarli tutti. Ma supponiamo che ci sia un solo record.
Quindi, senza che l'indice in esecuzione quella query richiedesse 1.000.000 di letture, con indes sono necessarie 5 letture. Anche se una lettura logica è un'operazione in memoria, c'è un costo sostanziale - in realtà è l'operazione più costosa in una query banale come quella sopra. Quindi ridurre la quantità di letture logiche necessarie di un fattore di 200.000 accelererà la tua query di un fattore simile.
Pertanto, una lettura logica non equivale a una scansione di tabella, ma una scansione di tabella provoca molte più letture logiche di una ricerca di indice.