Como leer planes de ejecución

Post on 04-Jul-2015

1.122 views 1 download

description

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.

Transcript of Como leer planes de ejecución

@SQSummit13

@enriquecatala

Como leer planes de ejecución

300

REL30006

Enrique Catala Bañuls

ecatala@solidq.com

MCT – Microsoft Active Professional – Technical Ranger

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.

COMUNICADO

2

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

Planes de ejecución¿Sabemos interpretarlos?

4

Optimizador de consultas

Sentencia SQL Plan de ejecuciónMágia

Operadores¿Cuántos y cuales son?

5

OperadoresLos básicos que debes conocer

6

SELECT SortClustered 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

Stream Aggregate Distribute Streams Gather Streams

Repartition

Streams Bitmap

Split Top Filter Lazy Spool Eager Spool

Operadores¿Qué son?

7

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

Operadores¿Qué hacen por dentro?

8

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

DEMO

9

Operadores básicos

Procesamiento lógicoDe una consulta

10

1. FROM

2. WHERE

3. GROUP BY

4. HAVING

5. SELECT1. Evaluar expresiones

2. Eliminar duplicados

6. ORDER BY

7. OFFSET-FETCH/TOP

Planes de ejecuciónFlechas

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

Planes de ejecuciónComparar planes

12

Fíjate en los % de consulta

Operadores joinNested 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

ID_Alum Nombre_Aluno ID_Curso

1Luis 2

2Ana 6

3Juan 5

4Pepe 3

5Carlos 4

6Felipe 3

7Iratxe 5

8María 4

Tabla de Alumnos:

ID_Curso Nombre_Curso

1Paisajismo

2Fotografía

3Arte Clásico

4Matemáticas

5Física

6Química

Tabla de Cursos:

Resultado:

Nombre Alumno | Nombre Curso

1-Luis |2-Fotografía

4-Pepe |3-Arte Clásico

6-Felipe |3-Arte Clásico

5-Carlos |4-Matemáticas

8-María |4-Matemáticas

...

Operadores joinMerge join

15

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

}

Tabla de Alumnos:

ID_Curso Nombre_Curso

1Paisajismo

2Fotografía

3Arte Clásico

4Matemáticas

5Física

6Química

Tabla de Cursos:

Resultado:

ID_Alunos Nome_Aluno

ID_Curso

s

1Luís 2

2Ana 6

3Juan 5

4Pepe 3

5Carlos 4

6Felipe 3

7Iratxe 5

8María 4

ID_Alum Nombre_Alumno ID_Curso

1Luís 2

4Pepe 3

6Felipe 3

5Carlos 4

8María 4

Nombre Alumno | Nombre Curso

1-Luis |2-Fotografía

4-Pepe |3-Arte Clásico

6-Felipe |3-Arte Clásico

5-Carlos |4-Matemáticas

8-María |4-Matemáticas

...

Operadores joinMerge join

Operadores joinHash join

17

Ejecución en dos fases1. 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)

}

DEMO

18

Leamos planes!

Operadores exchangeRepartition streams

21

• Consume múltiples fuentes y produce multiples fuentes

• No se modifican las filas

• Se reducen filas si aparece un operador bitmap

Operadores joinDiferencias

26

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

Merge join: – 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

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

ConclusionesObjetivos de la sesión

27

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

¿Preguntas?

28

¡Gracias!

Siéntate a comer con nosotros o tómate un café y aclara tus

dudas

29

@enriquecatala

Mentor

Enrique Catalá

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