Todo el mundo que trabaja con base de datos siempre se ha preguntado alguna vez qué son los planes de ejecución y como se leen. Saber leer un plan de ejecución nos va a dar información valiosísima de cara a mejorar el rendimiento de una consulta. En esta sesión vamos a centrarnos en aprender a leer T-SQL para interpretar lo que está haciendo SQL Server para devolvernos la información.
KELA Presentacion Costa Rica 2024 - evento Protégeles
Como leer planes de ejecución
1. REL30006
Como leer planes de ejecución
300
@enriquecatala
Enrique Catala Bañuls
ecatala@solidq.com
@SQSummit13
MCT – Microsoft Active Professional – Technical Ranger
2. COMUNICADO
EN CUMPLIMIENTO CON LA LEY 15/1999 DE PROTECCION DE DATOS DE
CARÁCTER PERSONAL, PONEMOS EN TU CONOCIMIENTO QUE
ESTA SESIÓN VA A SER GRABADA
POR SOLIDQ Y QUE ESTA GRABACIÓN PODRÍA SER UTILIZADA COMO MATERIAL
DE MARKETING Y HACERSE PUBLICA A TRAVÉS DE DIVERSOS MEDIOS, COMO
POR EJEMPLO NUESTRA PAGINA WEB.
TENIENDO EN CUENTA QUE TU IMAGEN PUEDE APARECER EN ESA GRABACIÓN,
SI NO DESEAS APARECER, ROGAMOS NOS LO COMUNIQUES POR LOS MEDIOS
QUE YA CONOCES.
2
3. Objetivos de la sesión
1. Familiarizarse con entorno SSMS para
extraer información de planes de
ejecución
2. Ser capaces de leer los planes de
ejecución
3. Conocer el funcionamiento de los
operadores mas importantes
3
6. Operadores
Los básicos que debes conocer
SELECT
Sort
Clustered Index
Seek
Clustered Index
Scan
Non-clustered
index scan
Non-clustered
index seek
Table Scan
RID Lookup
Key Lookup
Hash Match
Nested Loops
Merge Join
Compute Scalar
Constant Scan
Spool
Bitmap
Eager Spool
Stream Aggregate
Distribute Streams
Gather Streams
Repartition
Streams
Split
Top
Filter
Lazy Spool
6
7. Operadores
¿Qué son?
SQL Server 2012 posee unos 166 operadores lógicos y físicos
Todo operador funciona pidiendo filas de uno o mas hijos y
devolviéndolas al que se las ha pedido
– Caso especial Common Table Spool
Cada operador devuelve de 1 fila en 1 fila
– *No todos
7
8. Operadores
¿Qué hacen por dentro?
Tipo Operador
Open()
GetNext()
Close()
Scan/Seek
• Abrir con al motor
relacional
• Pedir fila a tabla
• Cerrar conexión
Filter
• Abrir iterador hijo
• Llamar GetNext() del
hijo mientras no se
cumpla el filtro
• Cerrar conexión con
hijo
Sort
• Reservar espacio
worktable
• Abrir conexión a
operador hijo
• GetNext() a hijo
• Meter filas en
worktable
• Cerrar conexión a
hijo
• Ordenar contenidos
worktable
• Devolver filas del
worktable una vez
ordenadas
• Destruir worktable
Merge Join
• Abrir ambos
operadores hijo
• Llamar a GetNext del
input con el minimo
valor hasta que un
match se detecte,
devolviendo el match
• Cerrar ambos inputs
8
10. Procesamiento lógico
De una consulta
1.
2.
3.
4.
5.
FROM
WHERE
GROUP BY
HAVING
SELECT
1. Evaluar expresiones
2. Eliminar duplicados
6. ORDER BY
7. OFFSET-FETCH/TOP
10
11. Planes de ejecución
Flechas
1.
2.
Analiza el grosor de las flechas
Compara los valores del plan estimado vs. el real
¿Ves la diferencia en el grosor de la flecha?
Estimación un poco equivocada!
11
13. Operadores join
Nested loops
for each row R1 in the outer table
for each row R2 in the inner table
if R1 joins with R2
return (R1, R2)
*No confundir inner table con inner join ni
outer table com outer join
13
14. Tabla de Cursos:
Tabla de Alumnos:
ID_Alum Nombre_Aluno ID_Curso
1Luis
2
2Ana
6
3Juan
5
4Pepe
3
5Carlos
4
6Felipe
3
7Iratxe
5
8María
4
ID_Curso
Nombre_Curso
1Paisajismo
2Fotografía
3Arte Clásico
4Matemáticas
5Física
6Química
Resultado:
Nombre Alumno
1-Luis
4-Pepe
6-Felipe
5-Carlos
8-María
...
|
Nombre Curso
|2-Fotografía
|3-Arte Clásico
|3-Arte Clásico
|4-Matemáticas
|4-Matemáticas
15. Operadores join
Merge join
get first row R1 from input 1
get first row R2 from input 2
while not at the end of either input
{
if R1 joins with R2
{
return (R1, R2)
get next row R2 from input 2
}
else if R1 < R2
get next row R1 from input 1
else
get next row R2 from input 2
}
15
17. Operadores join
Hash join
Ejecución en dos fases
1. Build: Cálculo de clave hash del inner
2. Prueba: Lee la outer, crea su hash y compara con hash
precalculado en fase build
for each row R1 in the build table
{
calculate hash value on R1 join key(s)
insert R1 into the appropriate hash bucket
}
for each row R2 in the probe table
{
calculate hash value on R2 join key(s)
for each row R1 in the corresponding hash bucket
if R1 joins with R2
return (R1, R2)
}
17
20. Operadores join
Diferencias
Nested Loops:
–
–
–
–
–
–
Útiles para conjuntos pequeños de resultados.
Su eficiencia depende del producto de tabla inner (arriba) * tabla outer (abajo)
Puede escupir resultados inmediatamente
soporta cualquier tipo de join
Es el que más frecuentemente se encuentra
Es altamente ineficiente si los conjuntos de datos son grandes
–
–
Util para conjuntos relativamente medianos de resultados.
Es el mejor cuando hablamos de grandes valores de datos en tabla inner y outer porque su eficiencia
depende de la suma de filas de ambas tablas
Puede escupir resultados inmediatamente
Solo soporta equijoin
Los datos deben ser ordenados
Merge join:
–
–
–
Hash join:
–
–
–
–
Util para grandes conjuntos de resultados no ordenados y cuando la tabla que manda (inner) tiene
sustancialmente menos filas que la dependiente.
Hasta no estar todo calculado, no escupe resultados
Ineficiente si las dos tablas son muy grandes
Su existencia indica:
•
•
•
•
•
Falta un índice o el que existe no nos sirve
Falta WHERE
Alguna condicion no satisface al indice (en caso de haberlo) por culpa de algun calculo o algo...
Si la estimación de memoria inicial es mala…paginacion a disco!
Hash Warning Events - Profiler
26
21. Conclusiones
Objetivos de la sesión
1. Ya sabemos como obtener información
relevante
2. Podemos leer sin miedo planes de
ejecución
3. Conocemos el funcionamiento interno de
operadores comunes
27
24. Si quieres disfrutar de las mejores sesiones de
nuestros mentores de España y Latino América,
ésta es tu oportunidad.
http://summit.solidq.com/madrid/
Síguenos:
30
Notas del editor
Son unos 166 en SQL Server 2012 y su lista para 2012 aquí: http://msdn.microsoft.com/en-us/library/ms191158(v=sql.110).aspx No toda operación tiene representación.Los operadores paralelos poseen una variante con doble flecha en la parte inferior izquierda
5’Los dibujitos son bastante explicativos
Los operadores de tipo índice columnar y los de tipo Exchange paralelos, que funcionan enviando paquetes de filas
10’Obviamente dependen del operador
Aprovechar para planes de ejecución actuales vs estimados15’
Esto es importantísimo para entender los planes de ejecución
Minuto 30’
Es el operador mas sencilloEs un doble bucle
Lee simultáneamente las dos entradasAmbas entradas deben estar ordenadas
37’Si se estima menos memoria para hash, aparecen los temidos hash warnings…
NestedLoops: Útiles para conjuntos pequeños de resultados. Su eficiencia depende del producto de tabla inner (arriba) * tabla outer (abajo)Puede escupir resultados inmediatamentesoporta cualquier tipo de joinEs el que más frecuentemente se encuentraEs altamente ineficiente si los conjuntos de datos son grandesMergejoin: Util para conjuntos relativamente medianos de resultados. Es el mejor cuando hablamos de grandes valores de datos en tabla inner y outer porque su eficiencia depende de la suma de filas de ambas tablasPuede escupir resultados inmediatamenteSolo soporta equijoinLos datos deben ser ordenados "the inputs tothemergejoinmust be sortedonthejoinkeys. Forexample, ifwehave a joinpredicate “T1.a = T2.b,” table T1 must be sortedon T1.a and table T2 must be sortedon T2.b"Hash join: Util para grandes conjuntos de resultados no ordenados y cuando la tabla que manda (inner) tiene sustancialmente menos filas que la dependiente.Hasta no estar todo calculado, no escupe resultadosIneficiente si las dos tablas son muy grandesSu existencia indica:Falta un índice o el que existe no nos sirveFalta WHEREAlguna condicion no satisface al indice (en caso de haberlo) por culpa de algun calculo o algo...Si la estimación de memoria inicial es mala…paginacion a disco!Hash Warning Events - Profiler