Puede usar una de estas dos consultas para ver las lecturas lógicas totales y las lecturas físicas totales.
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;
El primero desglosa esto por declaración, el segundo cuenta en todo el procedimiento.
Las lecturas físicas son lecturas contra el disco, las lecturas lógicas son contra memoria. Puede usar esto para determinar qué procedimientos o declaraciones son los más costosos en su sistema y tratar de ajustarlos.
Tenga en cuenta que, si bien las lecturas lógicas son significativamente más baratas que las lecturas físicas, siguen siendo caras, por lo que reducir el número de ellas (por ejemplo, agregando un índice apropiado) puede hacer que sus consultas se ejecuten mucho más rápido.
Hay muchas columnas adicionales en los DMV anteriores que también pueden resultar interesantes.
¿Cómo ayuda un índice a reducir las lecturas lógicas?
En SQL Server, todos los datos están organizados en bloques, de 8 KB de tamaño. Estos bloques se llaman "páginas".
Cada tabla contiene páginas "meta" que contienen información sobre la estructura de la tabla, así como páginas pata. Si no existe un índice y ejecuta una consulta como SELECT * FROM tbl WHERE Id = 7
SQL Server, debe buscar esta o estas filas en toda la tabla. Por lo tanto, se lee en una página a la vez, recorre todas las filas de cada página para determinar las filas que se ajustan a la WHERE
cláusula. Entonces, si la tabla requiere que se almacenen 1,000,000 de páginas, esta consulta tomará 1,000,000 de lecturas lógicas para ejecutarse.
Si tiene un índice, SQL Server ordena los datos lógicamente dentro de las páginas y establece una lista vinculada entre las páginas. Esto permite ejecutar consultas con un ORDER BY
para ejecutarse sin una operación de clasificación costosa. Pero lo más importante es que la clasificación, SQL Server agrega un árbol B + a la tabla. Un árbol B + es una estructura comparable al índice de un libro, donde buscar una palabra clave específica me permite saltar directamente a la página que contiene la palabra clave. El libro típico tiene solo un nivel de índice, mientras que un árbol B + puede tener múltiples. Solo piense en un libro grande, donde el índice en sí es de varias páginas. En un caso así, tiene sentido agregar una capa de índice adicional que nos dice en qué página se encuentran las palabras de índice que comienzan S
.
Los árboles B + están optimizados para tener la menor cantidad de niveles posible, al tiempo que proporcionan la propiedad de que cualquier registro en el índice se puede encontrar leyendo una página por nivel de índice. Asuma la WHERE Id = 7
consulta anterior cuando tenga un índice ordenado Id
. Digamos que el índice tiene 5 niveles. Ahora, para encontrar todos los registros que coincidan con esta consulta, tengo que leer una página por nivel de índice (es decir, 5 páginas). Esto se llama "Búsqueda de índice". Si hay varios registros que se ajustan a la factura, es posible que deba seguir el índice ordenado durante un tiempo para recuperarlos todos. Pero supongamos que solo hay un registro.
Entonces, sin el índice en ejecución, esa consulta requirió 1,000,000 de lecturas, con indes requirió 5 lecturas. Aunque una lectura lógica es una operación en memoria, todavía hay un costo sustancial; de hecho, es la operación más costosa en una consulta trivial como la anterior. Por lo tanto, reducir la cantidad de lecturas lógicas necesarias por un factor de 200,000 acelerará su consulta por un factor similar.
Por lo tanto, una lectura lógica no es equivalente a una exploración de tabla, pero una exploración de tabla provoca muchas más lecturas lógicas que una búsqueda de índice.
Puedes usar SQL Profiler. Cuando comience el rastreo, debe elegir RPC completado, inicio de SP, inicio de SP Stm y inicio de SP completo (ver imagen a continuación)
Esto le permitirá ver cada consulta que se ejecuta dentro de los procedimientos almacenados. Le permitirá ver cuántas veces se llama a un procedimiento almacenado anidado. Cuando termine el seguimiento, debe guardarlo. Luego, vuelva a abrirlo, y después de eso, podrá filtrar (con el botón "Filtros de columna") para encontrar las consultas que le causan problemas. (por ejemplo: las consultas que tomaron más de x lecturas o que duraron más de x segundos (duración) ...)
Las opciones de perfil que le mostré también muestran el plan de ejecución, que también es de gran ayuda.
fuente
Parece una pregunta de optimización de consulta general. De su descripción yo haría:
fuente