La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

A. Jaime y C. Domínguez Diseño de Bases de Datos Laboratorios Diseño físico con índices en SQL Server.

Presentaciones similares


Presentación del tema: "A. Jaime y C. Domínguez Diseño de Bases de Datos Laboratorios Diseño físico con índices en SQL Server."— Transcripción de la presentación:

1 A. Jaime y C. Domínguez Diseño de Bases de Datos Laboratorios Diseño físico con índices en SQL Server

2 DBD Laboratorios índices © A. Jaime, C. Domínguez Objetivos Ejecución de scripts con el SQLServer Management Studio: Examen del plan de ejecución. Forzar el uso de un índice determinado (with (index (...))). Estudio de índices interesantes: consulta simple, con and, con or, con join, con agregados y vistas materializadas.

3 DBD Laboratorios índices © A. Jaime, C. Domínguez Nota sobre SQL Server 2005 Para que funcione correctamente todo lo que se estudia en este laboratorio es necesario haber instalado el service pack 2 (SP2). Consultar la siguiente página para descargarlo: amilyID=d07219b2-1e23-49c8-8f0c- 63fa18f26d3a&displaylang=es

4 DBD Laboratorios índices © A. Jaime, C. Domínguez Crear la BD Credito SQL Server Management Studio Inicia SQL Server Management Studio. (1)CrearBDCredito.sql Abre el fichero (1)CrearBDCredito.sql y haz click en:... tardará un rato. ! ! Ejecutar filas filas filas filas filas 461 bloques 17 bloques 183 bloques 57 bloques

5 DBD Laboratorios índices © A. Jaime, C. Domínguez Scripts T-SQL Disponemos de 6 scripts, numerados del 2 al 7, con ejemplos comentados (para facilitar el auto-estudio). En estas sesiones de laboratorio examinaremos estos ejemplos y realizaremos ejercicios similares.

6 DBD Laboratorios índices © A. Jaime, C. Domínguez FROMwith (index (apellido)) FROM Cliente with (index (apellido)) Plan de ejecución y forzar el uso de índices concretos El plan de ejecución es un gráfico, y se muestra en una solapa seleccionando previamente consulta Incluir plan de ejecución real: Se fuerza el uso de índices concretos con with:

7 DBD Laboratorios índices © A. Jaime, C. Domínguez Sin WITH en FROM: resultado óptimo Sin WITH, el optimizador elige la que considera mejor opción entre las disponibles. Trata de tomar la de menor nº de lecturas lógicas. Para que el optimizador pueda elegir una buena estrategia debe disponer de índices interesantes. Esos índices NO los crea el propio optimizador sino el diseñador de BD (nosotros). Dicha tarea se conoce como diseño físico.

8 DBD Laboratorios índices © A. Jaime, C. Domínguez Conteo del nº de bloques El nº de bloques se ve en la solapa Mensajes como lecturas lógicas: Para verlos hay que ejecutar previamente la instrucción set statistics io on. SQL Server usa mucha memoria para disponer de gran parte de la BD y reducir transferencias desde/a disco. Las lecturas lógicas son en realidad en memoria (las físicas son las reales al disco) y nos sirven para comparar diferentes ejecuciones de la misma consulta.

9 DBD Laboratorios índices © A. Jaime, C. Domínguez Varios planes de ejecución juntos Seleccionar varias consultas (sin go) y ejecutarlas. En la ayuda on-line se explican todos los iconos de los planes de ejecución: ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.es/udb9/html/17d5daa1-8f14- 46e2-9cea-0ed520217d1e.htm

10 DBD Laboratorios índices © A. Jaime, C. Domínguez Crear, modificar y borrar índices Usando la ventana de administrar índices y claves: Explorador de objetos Click en la BD y buscar la tabla click dcho en la tabla y elegir diseño icono administrar índices y claves Algunas instrucciones T-SQL para índices: Crear:create index nombreÍndice on tabla(atributos) Borrar:drop index tabla.nombreÍndice Mostrar:exec sp_helpindex tabla

11 DBD Laboratorios índices © A. Jaime, C. Domínguez Ventana administrar índices y claves Nombre del índice Columnas sobre las que se define el índice Si es o no clave Si las filas quedarán ordenadas por las columnas del índice Nombre del índice

12 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices físicos en SQL Server Los índices secundarios de tablas sin índice CLUSTERED (agrupado), es decir sin IP ni IA, son índices normales o físicos, como el del ejemplo. Un índice CLUSTERED mantiene las filas ordenadas por los atributos que forman el índice (el del ejemplo NO es). Todo índice CLUSTERED es físico. Si definimos sobre la tabla un índice CLUSTERED (sólo puede tener uno) todos los índices secundarios se reconstruyen como índices lógicos (ver pagina siguiente) Juan Feli 24 9 Ignacio Luisa Arantza Inés 8 28 Iker Roberto j c h f g e a m

13 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices lógicos en SQL Server El índice de la izda del dibujo es CLUSTERED ¿en qué se nota? Como la tabla tiene índice primario (clustered), sus IS son lógicos. El IS de la dcha del dibujo es lógico ¿en qué se distingue de los anteriores?

14 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Plan de ejecución: Table Scan y Clustered Index Scan Table Scan Recorrido secuencial de tabla montón Clustered Index Scan Recorrido secuencial de tabla con IP o IA

15 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Plan de ejecución: Index Scan a c e f g h j m 2 c a 5 8 j f 9 15 g 16 h e m a c e f g h j m c f j g IP Index Scan Recorrido de todas las hojas de un IS-c ó IS-nc

16 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Plan de ejecución: Clustered Index Seek a c e f g h j m a c e f g h j m c f j g IP Clustered Index Seek Recorrido raíz hoja en IP, IA, IS-c ó IS-nc Puede recorrer varias hojas a partir de la encontrada

17 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Plan de ejecución: Index Seek 2 c a 5 8 j f 9 15 g 16 h e m a c e f g h j m a c e f g h j m c f j g IP Recorrido raíz hoja en IP, IA, IS-c ó IS-nc Puede recorrer varias hojas a partir de la encontrada Index Seek IS

18 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: (índices físicos) Plan de ejecución: RID Lookup (índices físicos) Juan Feli 24 9 Ignacio Luisa Arantza Inés 8 28 Iker Roberto j c h f g e a m RID lookup Nested loops (inner join) Index seek Representa R2-ciclo simple

19 DBD Laboratorios índices © A. Jaime, C. Domínguez Búsqueda de claves Nested loops (inner join) Index seek Plan de ejecución: (índices lógicos) Plan de ejecución: Búsqueda de claves (índices lógicos) a c e f g h j m IP 2 c a 5 8 j f 9 15 g 16 h e m a c e f g h j m c f j g j f g Representa R2-ciclo simple

20 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación consulta simple con índices lógicos PK_cliente:IP(id) 94 bloques clustered index scan apellido1:IS-nc(apellido1) bloques Index Seek + Busq. claves apNomTfn:IS-nc(apellido1, apellido2, nombre, tfno) 8 bloques Index Seek ap1_ap2NomTfn:IS-nc(apellido1) en hojas ( apellido2, nombre, tfno ) 8 bloques Index Seek

21 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices interesantes para consultas simples La mejor opción es un índice que permita resolver la consulta recorriendo SÓLO nodos del índice (sin visitar las filas de la tabla). Conviene que el índice incluya TODOS los atributos de WHERE seguidos de los de SELECT. Los de SELECT pueden situarse sólo en las hojas con la opción include de create index

22 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: consulta simple Elimina todos los índices que pueda tener la tabla cargo salvo el primario (PK_cargo). Crea índices interesantes para la siguiente consulta: SELECT cliente SELECT cliente,id,fecha FROM FROM cargo WHERE BETWEEN and WHERE cliente BETWEEN 6000 and 7000 ¿Puedes bajar de 32 lecturas lógicas?

23 DBD Laboratorios índices © A. Jaime, C. Domínguez Consultas con AND Abre el segundo script: (3)AND.sql Allí se analiza la siguiente consulta sobre la tabla cliente: Sigue los pasos del script. Trata de entender qué ocurre en cada momento. Qué índice da mejores resultados y por qué SELECT SELECT id, nombre, region FROM FROM cliente WHERELIKE WHERE nombre LIKE 'K%' AND AND region IN ('La Rioja', 'País Vasco') AND AND id > 5000

24 DBD Laboratorios índices © A. Jaime, C. Domínguez Iconos nuevos Filter Hash Match / Inner Join

25 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación 1ª consulta con AND PK_cliente : IP(id) 48 bloques Nombre: IS-nc(nombre) 623 bloques Region: IS-nc(region) bloques Nombre+Region: IS-nc(nombre) + IS-nc(region) 21 bloques NomReg: IS-nc(nombre, region) 4 bloques SELECT id, nombre, region FROM cliente WHERE nombre LIKE 'K% AND region IN('La Rioja', 'País Vasco') AND id > 5000

26 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices interesantes para AND Cada subcondición añadida con AND va limitando el resultado. Interesa empezar con un índice sobre una columna de WHERE que obtenga pocas tuplas (selectiva). Si hay un índice así, puede valernos. Si no, se intenta con varias columnas de WHERE que obtengan pocas tuplas. No tienen por qué ser todas. Si no hay nada selectivo probar a cubrir la consulta (todos los atributos de WHERE y SELECT)

27 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: consulta con AND Crea índices interesantes para la siguiente consulta: SELECT SELECT cliente, id, fecha FROM FROM cargo WHERE BETWEENAND WHERE cliente BETWEEN 6000 and 7000 AND BETWEEN cantidad BETWEEN 5 00 and 800 ¿Puedes bajar de 43 lecturas lógicas (no 44, sino 43)?

28 DBD Laboratorios índices © A. Jaime, C. Domínguez Consultas con OR Abre el tercer script: (4)OR.sql Allí se analiza la siguiente consulta y otras similares: Sigue los pasos del script. Cuál de los índices da mejores resultados en cada caso y por qué SELECT SELECT nombre, apellido, region, id FROM FROM cliente WHEREOR WHERE nombre = 'Pepe' OR apellido1 = 'Pérez'

29 DBD Laboratorios índices © A. Jaime, C. Domínguez Iconos nuevos Sort/Distinct Concatenation Merge Join/Union

30 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación consulta con OR Con OR: NomApReg IS-nc( nombre,apellido1,region ) o 53 bloques Con UNION: NomApReg y ApNomReg o 13 bloques Con UNION ALL: NomApReg y ApNomReg o 13 bloques

31 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices interesantes para OR Una fila forma parte del resultado si una subcondición cualquiera del WHERE es cierta OR es similar a UNIÓN: Si sirve una solución con UNIÓN (mejor UNION ALL) usarla. Si SELECT incluye un identificador de fila (como la clave primaria), entonces OR y UNIÓN son equivalentes. Si no, pueden dar soluciones diferentes. Interesa encontrar índices útiles para cada subconsulta del WHERE (de las unidas con OR) Si nada va bien podemos buscar índices interesantes para toda la condición del WHERE Ir probando hasta dar con una solución satisfactoria

32 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: consulta con OR Crea índices interesantes y, si es conveniente, transforma la siguiente consulta: ¿Puedes bajar de 326 lecturas lógicas con or? ¿y de 44 con union? SELECT SELECT id, cantidad, extracto, cliente FROM FROM cargo WHERE OR WHERE cantidad > 975 OR extracto = 20000

33 DBD Laboratorios índices © A. Jaime, C. Domínguez Consultas con JOIN Abre el quinto script: (5)JOIN.sql Allí se analizan la siguiente consulta con JOIN. SELECT SELECT i.id, e.id FROM FROM ingreso as i JOIN extracto as e ON ON i.cliente=e.cliente WHERE WHERE i.cantidad between 1000 and 2000 Sesión 2

34 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Iconos nuevos Nested Loops / Inner Join Nested Loops / Inner Join Representación de ciclo anidado (R1) Representación de ciclo único (R2) Recorrido de la tabla si no tiene IP ni IA

35 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación de consultas con JOIN Sin ningún IS: 17 ing + 64 ext = 81 bloques Con IS en extranjera/foránea: 17 ing + 51 ext = 68 bloques Con IS que incluyen WHERE y SELECT: 2 ing + 51 ext = 53 bloques ing ext ing ext cliente ing ext cantCli cliente

36 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices interesantes para JOIN Crear un índice para cada clave primaria y uno para cada clave foránea/extranjera de los JOIN. Crear índices adecuados para la condición WHERE (igual que en las consultas sobre una tabla). Probar Probar a crear un índice en cada tabla que incluya sus atributos de WHERE y JOIN. Crearlo en ambos órdenes (primero los de WHERE y primero los de JOIN ). Probar Probar a añadir a los últimos índices creados, además de los atributos de WHERE y JOIN, los de SELECT. Si hay más de un JOIN, analizar el que suponga mayor costo. Si no es suficiente estudiar el siguiente más costoso. Continuar estudiando JOIN hasta encontrar una solución satisfactoria.

37 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: consulta con JOIN Crea índices interesantes para la siguiente consulta que se encuentra al final del script. Antes haz la siguiente modificación sobre la tabla cliente: ¿Qué algoritmo utiliza? ¿Puedes bajar de bloques? SELECT SELECT c.id, c.apellido1, k.cantidad FROM FROM cliente as c JOIN JOIN cargo as k ON ON c.id=k.cliente WHERE WHERE c.region = 'Aragón' UPDATE UPDATE cliente SET SET region = 'Aragón' WHERE WHERE id%19=0 or id%21=0 or id%22=0

38 DBD Laboratorios índices © A. Jaime, C. Domínguez Consultas con agregados (como SUM) Abre el sexto script: (6)Agregadas.sql Allí se analiza la siguiente consulta sobre la tabla cargo: Sigue los pasos del script. Cuál de los índices da mejores resultados y por qué SELECTSUM SELECT cliente, SUM(cantidad) AS Total FROM FROM cargo GROUP BY GROUP BY cliente ORDER BY ORDER BY cliente

39 DBD Laboratorios índices © A. Jaime, C. Domínguez Plan de ejecución: Iconos nuevos Cálculo de SUM, AVG,.. aprovechando el orden del recorrido Stream aggregate / Aggregate

40 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación consulta con SUM Sólo con IP: 461 bloques IS(cantidad, cliente): 237 bloques Con IS(cliente, cantidad): 237 bloques

41 DBD Laboratorios índices © A. Jaime, C. Domínguez Índices interesantes para agregados (como SUM) Se calcula de dos formas: Con un fichero intermedio hash (dir. calculado) Recorriendo un índice/fichero ordenado adecuadamente Conviene usar la 2ª opción para evitar el coste de crear el fichero intermedio Interesa crear índices que incluyan a los atributos de GROUP BY, a los de WHERE y a los de SELECT (sobre los que se aplica la función, por ejemplo SUM)

42 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: consulta con agregados Crea índices interesantes para la siguiente consulta: ¿Puedes bajar de un total de 9 bloques? SELECT MAX SELECT MAX (saldo), apellido1 FROM FROM cliente WHERE WHERE region='Aragon' GROUP BY GROUP BY apellido1 ORDER BY MAX ORDER BY MAX (saldo)

43 DBD Laboratorios índices © A. Jaime, C. Domínguez Cómo crear vistas (vistas normales, no materializadas) Como vimos en el primer laboratorio, es posible crear vistas: Con Microsoft SQL Management Studio: en Vistas Nueva Vista. Se abre el asistente para creación de vistas que coincide con el QBE de las consultas. Con el analizador de consultas: usando la sintaxis de SQL create view... Una vista puede entenderse como una tabla virtual o como una consulta almacenada.

44 DBD Laboratorios índices © A. Jaime, C. Domínguez Uso de vistas materializadas Uso de vistas materializadas (vistas indexadas de SQL Server) Abre el sexto script: (7)VistasMaterializadas.sql Allí se analiza la misma consulta con agregados anterior: Sigue los pasos del script. Cómo se consigue ahora el mejor resultado y por qué SELECTSUM SELECT cliente, SUM(cantidad) AS Total FROM FROM cargo GROUP BY GROUP BY cliente ORDER BY ORDER BY cliente

45 DBD Laboratorios índices © A. Jaime, C. Domínguez Comparación: sólo índices frente a vistas materializadas Sin vista: 237 bloques Con vista indexada (materializada): 25 bloques Recorrido de la vista indexada Recorrido del índice anterior

46 DBD Laboratorios índices © A. Jaime, C. Domínguez Uso de vistas materializadas (indexed views) con Sólo podemos utilizarlas con: SCHEMABOUND: impide modificar la definición de la tabla base COUNT_BIG en SELECT cuando hay funciones agregadas Problema Problema: Puede afectar al rendimiento de INSERT / DELETE / UPDATE sobre la tabla base Ventajas: El resultado de la consulta se mantiene continuamente calculado Se reduce el uso de Cache (ver ejemplos de ampliación)

47 DBD Laboratorios índices © A. Jaime, C. Domínguez Ejercicio: uso de vistas materializadas Crear una vista indexada para la siguiente consulta. Comparar con el mejor resultado logrado en (4)JOIN.sql (53) Ayuda: construir el índice sobre i.id y e.id (columnas del select). ¿Te da 2 bloques? (frente a 53: mejor opción con índices). SELECT SELECT i.id, e.id FROM dbo. FROM dbo. ingreso as i JOIN dbo. dbo. extracto as e ON ON i.cliente=e.cliente WHERE WHERE i.cantidad between 1000 and 2000

48 DBD Laboratorios índices © A. Jaime, C. Domínguez Aporta soluciones tanto con vistas materializadas como sólo con índices: SELECT SELECT c.id, e.id FROMJOIN FROM cargo as c JOIN extracto as e ON ON c.cliente=e.cliente WHERE OR WHERE c.cantidad=1000 OR year(e.fecha) < 2003 SELECTavg SELECT c.id, c.apellido1, avg(i.cantidad) FROM JOIN FROM cliente as c JOIN ingreso as i ON ON c.id=i.cliente WHERE WHERE c.region = 'Aragón' GROUP BY GROUP BY c.id, c.apellido1 Ejercicios: mezclando cosas


Descargar ppt "A. Jaime y C. Domínguez Diseño de Bases de Datos Laboratorios Diseño físico con índices en SQL Server."

Presentaciones similares


Anuncios Google