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

Slides:



Advertisements
Presentaciones similares
MOVIMIENTO JOVENES DE LA CALLE CIUDAD DE GUATEMALA chi siamo quienes-somos qui sommes-nous who we are attività actividades activités activities scuola.
Advertisements

Insertar un cuadro de texto
SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR
1 Datos sobre webloggers Datos extraidos de la encuesta a webloggers disponibles en la web de los autores.
Los números del 0 al cero uno dos tres cuatro cinco 6 7 8
1 LA UTILIZACION DE LAS TIC EN LAS MICROEMPRESAS GALLEGAS. AÑO mayo 2005.
1 INFORME RESUMEN SOBRE EL NIVEL DE UTILIZACION DE LAS TIC EN LAS EMPRESAS GALLEGAS ( Resumen PYMES ) Noviembre de 2004.
AYUDA A LA FUNCIÓN DOCENTE Internet
Diseño de Bases de Datos
Diseño de Bases de Datos
Diseño de Bases de Datos
TEMA 5.- 1ª PARTE. EL A.O. Y SUS APLICACIONES
TEMA 2 MÚLTIPLOS Y DIVISORES
02- Plan Organización Docente v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
02- PLAN DOCENTE Febrero 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
01- OFERTA FORMATIVA v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
Aladdín-respuestas 1.Vivía 2.Era 3.Amaba 4.Quería 5.Gustaban 6.Se sentía 7.Salía 8.Tenía 9.Decidió 10.escapó 11. Se vistió 12. Conoció 13. Vio 14. Pensó
Respuestas Buscando a Nemo.
ABECEDARIO FIGURAS GEOMÉTRICAS NÚMERO
Introducción Lenguaje de manipulación de datos (Data Manipulation Language) Permite a los usuarios llevar a cabo las tareas de consulta o manipulación.
integridad referencial
SIMATICA V2.0. Automatización de Viviendas con Simatic S7-200
IBD Clase 7.
Estadísticas en SQL Server Rocío Contreras Águila, Primer Semestre 2010.
Mulán /75 puntos. 1.Querían 2.Gustaban 3.Escuchó 4.Dijo 5.Tenía 6.Ayudaron 7.Maquillaron 8.Arreglaron 9.Dio 10.Estaba 11.Iba 12.Quería 13.Salió 14.Gritó
Optimización del rendimiento de las consultas
5 pt 5 pt 5 pt 5 pt 5 pt 10 pt 10 pt 10 pt 10 pt 10 pt 15 pt 15 pt
1 XML Extensible Markup Language HTML HyperText Markup Language normas06_01.xml.
Distribuciones de probabilidad bidimensionales o conjuntas
Campus virtual Autoevaluaciones Teletutorías Salas de estudio Clases en línea Contratos didácticos Proyecto E.D.U.F. Universidad Universidad.
Funciones Excel. Parte 1. Introducción 2 Una función Excel es una fórmula o un procedimiento que se realiza en el ambiente de Visual Basic, fuera de.
Tutorial Proceso de Compra
Autodesk Civil 3D 2007 Essentials
Fernando Velasco
Phone2Wave-Server Manual de Operación.
TELEFONÍA IP.
Repaso del capítulo Primer Paso
Parte 3. Descripción del código de una función 1.
Tema 1.- Aritmética. 1.-Usar el algoritmo de Euclides para calcular el máximo común divisor de a y b y expresarlo en función de a y b para: a) a= 56,
EL OSO APRENDIZ Y SUS AMIGOS
Mejoras a la Cláusula GROUP BY
1 PROYECTO DE PRESUPUESTO DE EGRESOS DE LA FEDERACION 2002 COORDINACIÓN DE POLITICA ECONOMICA GP-PRD.
Ecuaciones Cuadráticas
C REACIÓN DE B LOGS EN ESPOL Profesora: Eva María Mera Intriago Escuela Superior Politécnica del Litoral Impulsando la sociedad del conocimiento Instituto.
Kpmg. El comercio electrónico y sus incertidumbres Resultado de la encuesta sobre
CÁLCULOS ESTEQUIOMÉTRICOS
¡Primero mira fijo a la bruja!
Lógica Proposición Ejemplos
¿Qué es un conjunto? Un conjunto es una colección de objetos considerada como un todo. Los objetos de un conjunto son llamados elementos o miembros del.
Unidad 3 Lenguaje SQL Contenidos Que es SQL ? Estructura de SQL
Lenguaje Estructurado de Consultas (Structured Query Language – SQL)
0 1 ¿Qué hora es? By: Craig Tillmann Revised by: Malinda Seger Coppell High School Coppell, TX.
Índice Sesión I Bloque I (09:30 a 10:30 Horas) Configuración Inicial
E.1 Obtener los detalles completos de todos los proyectos.
Introducción al lenguaje R Sesión 2: Objetos en R
MSc. Lucía Osuna Wendehake
Realimentacion de la salida
SUCESIONES Y PROGRESIONES.
Estructuras de control
Manual de Procedimientos Procedimiento de ejecución del programa de
Actualización de SP3D (Aspectos generales)
Herramienta FRAX Expositor: Boris Inturias.
Estadística Administrativa I
Subconsultas Avanzadas
LENGUAJE SQL.
Unidad 6. Tema 4. Lenguaje de consultas SQL
DLM Transact SQL Sesión I Introducción al SQL Server Uso de las herramientas de consultas del Transact SQL.
Bases de datos II Universidad del Cauca Ing. Wilson Ortega.
Structure Query Languaje SQL. Introducción a SQL El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por.
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:

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

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.

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

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

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.

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:

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.

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.

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

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

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

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

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?

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

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

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

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

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

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

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

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

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?

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

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

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

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)

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)?

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'

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

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

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

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

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

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

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

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.

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

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

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

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

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)

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)

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.

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

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

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)

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

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