Documentos de Académico
Documentos de Profesional
Documentos de Cultura
básicas
Vamos a tratar de explicar cómo interpretar planes de ejecución gráficos
básicos, es decir, planes de ejecución para sentencias del tipo SELECT,
UPDATE, INSERT Y DELETE, con sólo unos pocos JOINS y si no hay
funciones avanzadas o indirectas.
Los planes gráficos están basados en iconos, y el número de iconos a aprender
es mínimo. Cada icono representa un operador específico dentro de la
ejecución del plan. Se va a utilizar el término "icono" y "operador" de forma
intercambiable.
Hay 78 operadores disponibles. Afortunadamente, no es necesario memorizar
todos antes de que podamos leer un plan de ejecución gráfico. La mayoría de
las consultas utilizan sólo un pequeño subconjunto de operadores, y nos
centraremos en los principales. Si vemos un icono desconocido, se puede
encontrar más información al respecto en los libros en pantalla.
http://msdn2.microsoft.com/en-us/library/ms175913.aspx.
Un plan de ejecución gráfico muestra cuatro tipos distintos de operadores:
• Los operadores lógicos y físicos, también llamados iteradores, aparecen como
iconos azules y representan la ejecución de consultas u operaciones DML.
• Operadores de paralelismo físico son también iconos azules y representan
operaciones de paralelismo. Son un subconjunto de los operadores lógicos y
físicos, pero conllevan un nivel completamente diferente de análisis en el plan
de ejecución.
• Operadores de cursor, tienen iconos de color amarillo y representan
operaciones de cursor de SQL.
• Elementos del lenguaje son iconos verdes y representan elementos del
lenguaje SQL, como ASSIGN, DECLARE, IF, SELECT (RESULT), WHILE.
Nos centraremos principalmente en los operadores lógicos y físicos, incluyendo
algunos operadores de paralelismo físico. Algunos textos enumeran en orden
alfabético todos los operadores, pero esta no es la forma más fácil de
aprenderlos, aquí nos centraremos en los iconos más comunes.
Podemos aprender mucho de cómo trabajan los operadores observando la
forma en que operan dentro de los planes de ejecución. La clave, es aprender
a utilizar las propiedades de cada uno de los operadores y profundizar en ellas.
Cada operador, tiene un conjunto diferente de características. Algunos
operadores, principalmente Sort, Hash Match (Aggregate) y Hash Join
requieren una cantidad variable de memoria para ejecutarse. Una consulta con
uno de estos operadores puede tener un tiempo de retardo antes de su
ejecución, pudiendo afectar negativamente al rendimiento. A continuación, se
muestra una lista de los operadores.
La mayoría de los operadores se comportan de dos formas: de bloqueo o de no
bloqueo. Un operador no-bloqueo crea datos de salida al mismo tiempo que
recibe la entrada. Un operador de bloqueo tiene que obtener todos los datos
antes de generar su salida. Los operadores de bloqueo pueden producir
problemas de concurrencia, perjudicando el rendimiento.
Un ejemplo de un operador de no-bloqueo sería Merge Join que produce
datos de salida mientras va leyendo los datos de entrada. Podemos saberlo
porque un operador Merge Join necesita datos para funcionar correctamente,
por lo que no puede producir su salida si no dispone de datos de entrada.
Un ejemplo de un operador de bloqueo sería el Hash Match. Pues debe poseer
todos los datos antes de poder unirlos y producir una salida.
La clave para entender los planes de ejecución, es empezar a aprender a
entender lo que hacen y cómo afecta esto a la consulta.
Algunas consultas de tabla sencilla
Vamos a comenzar con algunos planes muy sencillos con base en consultas de
tabla individuales.
Clustered Index Scan (exploración de Índice Agrupado)
Es necesario un operador Key Lookup (hay dos: RID y Claves) para obtener
datos de la pila o del índice agrupado, respectivamente, cuando se utiliza un
índice no agrupado, pero no está cubierto por un índice. Un ejemplo es una
consulta que devuelve varias columnas de una tabla.
SELECT p.strNumDoc,
p.strEjercicio,
p.strExpediente,
p.strfase
FROM dbo.tbExpediente AS p
WHERE p.strExpediente LIKE '010092%';
Existen varias razones por las que puede suceder un recorrido de tabla, pero a
menudo suceden porque no existen índices útiles en la tabla, y el optimizador
de consultas tiene que buscar a través de cada fila con el fin para identificar las
filas a devolver. Otra causa común de un recorrido de tabla es una consulta
que pide todas las filas de una tabla, como es el caso en este ejemplo.
Cuando se necesitan todas (o la mayoría) de las filas de una tabla entonces
suele ser más rápido para el optimizador devolverlas todas antes de buscar
cada fila en un índice. Esto sucede comúnmente en las tablas con pocas filas.
Suponiendo que el número de filas de una tabla es relativamente pequeño, el
recorrido completo de la tabla no suele ser un problema. Pero si la tabla es
grande, entonces es posible que se desee investigar la forma de volver a
escribir la consulta para que devuelva menos filas, o agregar un índice para
acelerar el rendimiento.
RID lookup (Operaciones de búsqueda RID)