-
1.
Como leer planes de
ejecución
Enrique Catala Bañuls
MVP , Mentor SolidQ
ecatala@solidq.com | enrique@enriquecatala.com
Twitter: @enriquecatala
www.enriquecatala.com
-
2.
3 Sponsor Sessions at 11:15
Don’t miss them, they might be getting
distributing some awesome prizes!
HP
SolidQ
Pyramid Analytics
Also Raffle prizes at the end of the
event provided by
HP, SolidQ, Pyramid Analytics, Altran &
Microsoft
-
3.
Our Main Sponsors:
-
4.
Agenda
Repaso rápido
Generación de planes
Procesamiento lógico
Operadores join
Operadore exchange
Demos!
-
5.
Planes de ejecución
¿Sabemos interpretarlos?
5
Optimizador de
consultas
Sentencia SQL Plan de ejecución
Mágia
-
6.
Generación de plan de ejecución
El optimizador utiliza dos tipos de clave
Tiempo E/S: Coste de leer páginas de un
subsistema de disco
Tiempo CPU: Coste de aplicar predicados y tuplas
en memoria
Estimación de costes
-
7.
Generación de plan de ejecución
En cada join, se incrementa
exponencialmente el nº de soluciones
posibles
Cuidado con el timeout!
-
8.
Visualizar plan de ejecución
SELECT *
FROM dbo.Pedidos p
INNER JOIN dbo.Items i
ON p.ID_Pedido = i.ID_Pedido
INNER JOIN dbo.Clientes c
ON p.ID_Cliente = c.ID_Cliente
INNER JOIN dbo.Produtos p
ON i.ID_Produto = p.ID_Produto
Para no Clikear
presionar CTRL-L
-
9.
Operadores
¿Qué son?
10
Casi todo operador funciona pidiendo
filas de uno o mas hijos y devolviéndolas
al que se las ha pedido
Caso especial
Common Table Spool
Operadores columnares
Cada operador devuelve de 1 fila en 1
fila
*No todos
-
10.
Planes de ejecución
Flechas
11
¿Ves la diferencia en el grosor de la flecha?
Estimación un poco equivocada!
1. Analiza el grosor de las flechas
2. Compara los valores del plan estimado vs. el real
-
11.
Planes de ejecución
Comparar planes
12
Fíjate en los % de consulta
-
12.
Operadores join
Nested loops
13
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.
Operadores join
Merge join
14
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
}
-
14.
Operadores join
Hash join
15
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)
}
-
15.
EQ_ROWS = Cantidad de líneas que poseen el último valor de la muestra
Ej: Existen 64 líneas para la mostra 111 (línea 5)
DISTINCT_RANGE_ROWS = Cantidad de valores distintos dentro de un intervalo. El
valor de RANGE_HI_KEY está EXCLUIDO
Ej: En la línea 5 (108 hasta 110) tenemos 3 valores distintos
Debería llamarse DISTINCT_RANGE_VALUES
AVG_RANGE_ROWS = Media de valores en el rango (RANGE_ROWS/ DISTINCT_RANGE_ROWS)
Ej: En la linea 5 tenemos 160 / 3 = 53,33333
RANGE_HI_KEY = Valor clave de cada muestra
Ej: En la línea 5 tenemos el valor 111 que va de 108 (107 (Línea 4)
+ 1) hasta 111
RANGE_ROWS = Cantidad de líneas que poseen valores iguales a los de la muestra
excluyendo el valor de RANGE_HI_KEY
Ej: La línea 5 va de 108 a 110 (excluyendo el valor
111(RANGE_HI_KEY)). Dentro de este rango tenemos 160 líneas
El valor buscado (110) está entre las líneas 4 y
5
SELECT *
FROM Items1
WHERE Quantity = 110
DBCC SHOW_STATISTICS (Items1, Stats_Quantity) WITH HISTOGRAM
DBCC SHOW_STATISTICS
-
16.
DEMO
18
Leamos planes!
-
17.
Propiedades
Sort
-
18.
Propiedades
Sort
-
19.
Propiedades
Key lookup
-
20.
Propiedades
Operador paralelo
-
21.
Operadores exchange
Distribute Streams
Hash
Los valores de
filas obtienen
hash y cada hilo
se
responsabiliza
de un rango
hash
Round
Robin
Los valores de
las filas se
envían al
siguiente hilo de
la lista
Range
Determina a que
hilo enviar la fila
evaluando una
funcion de
rango sobre una
columna
Rara y usada en
algunos parallel
index recreation
Broadcast
Todas las filas
se envian a
todos los hilos
Demand
Se usa un modo
pull en lugar de
push como en
las otras.
Envia la fila al
thread que se la
está pidiendo
Aparece en
tablas
particionadas
-
22.
Operadores exchange
Repartition streams
24
Consume múltiples fuentes y produce multiples fuentes
No se modifican las filas
Se reducen filas si aparece un operador bitmap
-
23.
Operadores exchange
Gather streams
Consume múltiples hilos y produce un único hilo
Combina resultados
Es el que mayor % de esperas suele generar
-
24.
Procesamiento lógico
De una consulta
26
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
1. Evaluar expresiones
2. Eliminar duplicados
6. ORDER BY
7. OFFSET-FETCH/TOP
-
25.
Conclusión
27
1. Repasar aspectos fundamentales de operadores
2. Ser capaces de leer los planes de ejecución mas
habituales
-
26.
Como leer planes de
ejecución
Enrique Catala Bañuls
MVP , Mentor SolidQ
ecatala@solidq.com | enrique@enriquecatala.com
Twitter: @enriquecatala
www.enriquecatala.com
Select * from sys.dm_exec_query_optimizer_info
Where counter in('optimizations, trivial plan', 'search 0', 'search 1', 'search 2')
Order by counter
Los operadores de tipo índice columnar y los de tipo Exchange paralelos, que funcionan enviando paquetes de filas
Esto es mucho mas frecuente de lo que parece. ¡Actualiza tus estadísticas!
Es el operador mas sencillo
Es un doble bucle
Lee simultáneamente las dos entradas
Ambas entradas deben estar ordenadas
37’
Si se estima menos memoria para hash, aparecen los temidos hash warnings…
Notas Hash Join:
-La existencia de Hash Join cuando la tabla inner no es sustancialmente menor típicamente indica que falta algun filtro.
-Hay que estar vigilantes ante Hash Warning Events – Profiler
-Altamente ineficiente si las tablas son muy grandes
Esto es necesario para entender la demo
Estimated CPU Cost
Coste de uso de CPU por el operador. Este número debe ser el menor posible.
Estimated I/O Cost
Coste de toda la actividad de I/O realizada por el operador. Este número debe ser el menor posible.
Estimated Operator Cost
Coste para el optimizador de consultas al ejecutar esta operación. Muestra entre paréntesis el porcentaje total del coste del operador en relación a todo el plan.
Estimated Number of Executions
Estimación del número de veces que el operador será ejecutado en el plan.
Estimated Number of Rows
Estimación del número de filas que el operador devolverá.
Estimated Row Size
Media estimada del tamaño del registro (en bytes) leido por el operador.
Estimated SubTree Cost
Suma del coste de todos los operadores ejecutados antes de este operador.
Estimated CPU Cost
Coste de uso de CPU por el operador. Este número debe ser el menor posible.
Estimated I/O Cost
Coste de toda la actividad de I/O realizada por el operador. Este número debe ser el menor posible.
Estimated Operator Cost
Coste para el optimizador de consultas al ejecutar esta operación. Muestra entre paréntesis el porcentaje total del coste del operador en relación a todo el plan.
Estimated Number of Executions
Estimación del número de veces que el operador será ejecutado en el plan.
Estimated Number of Rows
Estimación del número de filas que el operador devolverá.
Estimated Row Size
Media estimada del tamaño del registro (en bytes) leido por el operador.
Estimated SubTree Cost
Suma del coste de todos los operadores ejecutados antes de este operador.
Estimated CPU Cost
Coste de uso de CPU por el operador. Este número debe ser el menor posible.
Estimated I/O Cost
Coste de toda la actividad de I/O realizada por el operador. Este número debe ser el menor posible.
Estimated Operator Cost
Coste para el optimizador de consultas al ejecutar esta operación. Muestra entre paréntesis el porcentaje total del coste del operador en relación a todo el plan.
Estimated Number of Executions
Estimación del número de veces que el operador será ejecutado en el plan.
Estimated Number of Rows
Estimación del número de filas que el operador devolverá.
Estimated Row Size
Media estimada del tamaño del registro (en bytes) leido por el operador.
Estimated SubTree Cost
Suma del coste de todos los operadores ejecutados antes de este operador.
Estimated CPU Cost
Coste de uso de CPU por el operador. Este número debe ser el menor posible.
Estimated I/O Cost
Coste de toda la actividad de I/O realizada por el operador. Este número debe ser el menor posible.
Estimated Operator Cost
Coste para el optimizador de consultas al ejecutar esta operación. Muestra entre paréntesis el porcentaje total del coste del operador en relación a todo el plan.
Estimated Number of Executions
Estimación del número de veces que el operador será ejecutado en el plan.
Estimated Number of Rows
Estimación del número de filas que el operador devolverá.
Estimated Row Size
Media estimada del tamaño del registro (en bytes) leido por el operador.
Estimated SubTree Cost
Suma del coste de todos los operadores ejecutados antes de este operador.
Esto es importantísimo para entender los planes de ejecución