Advertisement
Advertisement

More Related Content

More from Enrique Catala Bañuls(20)

Advertisement

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
  4. Planes de ejecución ¿Sabemos interpretarlos? Sentencia SQL Mágia Plan de ejecución Optimizador de consultas 4
  5. Operadores ¿Cuántos y cuales son? 5
  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
  9. DEMO Operadores básicos 9
  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
  12. Planes de ejecución Comparar planes Fíjate en los % de consulta 12
  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
  16. Operadores join Merge join Tabla de Cursos: ID_Curso Nombre_Curso 1Paisajismo 2Fotografía 3Arte Clásico 4Matemáticas 5Física 6Química Tabla de Alumnos: ID_Alum Nombre_Alumno ID_Curso ID_Alunos Nome_Aluno s 2 1Luís 1Luís 2 4Pepe 3 2Ana 6 6Felipe 3 3Juan 5 5Carlos 4 4Pepe 3 8María 4 5Carlos 4 6Felipe 3 7Iratxe 5 8María 4 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
  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
  18. DEMO Leamos planes! 18
  19. Operadores exchange Repartition streams • • • Consume múltiples fuentes y produce multiples fuentes No se modifican las filas Se reducen filas si aparece un operador bitmap 21
  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
  22. ¿Preguntas? 28
  23. ¡Gracias! @enriquecatala Enrique Catalá Mentor Siéntate a comer con nosotros o tómate un café y aclara tus dudas  29
  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

Editor's Notes

  1. 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
  2. 5’Los dibujitos son bastante explicativos
  3. Los operadores de tipo índice columnar y los de tipo Exchange paralelos, que funcionan enviando paquetes de filas
  4. 10’Obviamente dependen del operador
  5. Aprovechar para planes de ejecución actuales vs estimados15’
  6. Esto es importantísimo para entender los planes de ejecución
  7. Minuto 30’
  8. Es el operador mas sencilloEs un doble bucle
  9. Lee simultáneamente las dos entradasAmbas entradas deben estar ordenadas
  10. 37’Si se estima menos memoria para hash, aparecen los temidos hash warnings…
  11. 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 &quot;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&quot;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
  12. Scan, seek, sort, lookupSortwarnings
Advertisement