Introducción a Evaluación y Optimización de Consultas ¿Cuál es el
Transcripción
Introducción a Evaluación y Optimización de Consultas ¿Cuál es el
Introducción a Evaluación y Optimización de Consultas Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 1 ¿Cuál es el propósito…? ! Obtener un “buen” plan de ejecución (Minimizar costo). Índices Consulta SQL Árbol de la Expresión Carácterísticas de las Tablas Plan de Ejecución Álgebra Relacional Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 2 Evaluación de Consultas Plan de Ejecución: Árbol de operadores de Álgebra Relacional, para cada opertador se ha seleccionado un algoritmo de implementación. ! Hay dos aspectos fundamentales en optimización de consultas: ! " Para una consulta dada ¿Qué planes son considerados? • Algoritmo para buscar en el espacio de planes el más barato (estimado). " ! Como se estima el costo de un plan? Idealmente: Encontrar el mejor plan. En la práctica: Evitar los peores planes. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke Por ejemplo SELECT S.sname FROM Reserves R, Sailors S WHERE R.sid=S.sid AND R.bid=100 AND S.rating>5 sname bid=100 3 sname (On-the-fly) rating > 5 (On-the-fly) rating > 5 sid=sid with pipelining ) sid=sid Reserves Sailors (Use hash index; do not write result to temp) bid=100 Sailors Reserves Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 4 Algunas técnicas comunes ! Los algoritmos para evaluar operadores relacionales usan las siguientes ideas: " Indexado: Se pueden usar las condiciones de WHERE para obtener conjuntos pequeños de tuplas (selecciones, reuniones) " Iteración: En algunos casos, es más rápido recorrer todas las tuplas aún si existe un índice. (También, podríamos recorrer el índice mismo en lugar de la tabla) " Particionado: Al usar ordenamiento o hashing, podemos particionar las tuplas de entrada y reemplazar una operación cara por operaciones similares sobre entradas más pequeñas. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 5 Catálogo y Estadísticas ! Se necesita información acerca de las relaciones y los índices involucrados. Usualmente el catálogo contiene al menos: " " " ! El catálogo es actualizado periódicamente. " ! # tuplas (NTuplas) y # pags (NPags) para cada relación. # valores distintos de clave (NKeys) y NPags para cada índice. Altura, y valores de clave menor/mayor (Low/High) para cada índice de árbol. Actualizarlo cada vez que los datos cambian es demasiado caro; muchas decisiones aproximadas, así que es tolerable algo de inconsistencia. Algunos SABDs almacenan información más detallada, por ejemplo: histogramas de los valores de un campo. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 6 Rutas de Acceso ! Una ruta de acceso es un método para recuperar tuplas: " Recorrido (rastreo) de archivo, o un índice que coincide (matches) con una selección (en la consulta). ! Un índice de árbol coincide con una conjunción de términos que involucran sólo atributos en un prefijo de la clave de búsqueda del índice. " ! Un índice de hash coincide con una conjunción de términos que tienen un término atributo = valor para cada atributo en la clave de búsqueda del índice. " ! E.g., índice de árbol sobre <a, b, c> coincide con la selección a=5 AND b=3, y a=5 AND b>6, pero no b=3. E.g., índice hash sobre <a, b, c> coincide con a=5 AND b=3 AND c=5; pero no con b=3, o a=5 AND b=3, o a>5 AND b=3 AND c=5. Se prefieren las rutas de acceso más selectivas (índices). Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 7 Esquema para los ejemplos Sailors (sid: integer, sname: string, rating: integer, age: real) Reserves (sid: integer, bid: integer, day: dates, rname: string) ! Reserves: " ! Cada tupla es de 40 bytes de largo, 100 tuplas por página, 1000 páginas. Sailors: " Cada tupla es de 50 bytes de largo, 80 tuplas por página, 500 páginas. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 8 Para selecciones… ! Encuentre la ruta de acceso más selectiva, obtenga con ella las tuplas, finalmente aplique los términos restantes (que no coinciden con el índice): " " " Ruta de acceso más selectiva: Un rastreo de índice o archivo que, estimamos, requerirá la menor cantidad de I/Os de página. Los términos que coinciden con este índice reducen el número de tuplas recuperadas; los demás términos se usan para descartar algunas de ellas, pero no afectan el número de tuplas/páginas buscadas. Considere day<8/9/94 AND bid=5 AND sid=3. Se puede usar un índice de árbol B+ sobre day; luego, bid=5 y sid=3 deben probarse para cada tupla recuperda. Alternativamente, un índice de hash sobre <bid, sid> podría ser usado; el término day<8/9/94 debe ser probado luego. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 9 Selecciones: usando índices ! El costo depende del número de tuplas que califican y del agrupamiento. " " Costo de encontrar las entradas de datos que califican (típicamente pequeño) más costo de recuperar los registros (sin agrupamiento puede ser grande). En el ejemplo, asumiendo una distribución uniforme de nombres, ~ 10% de tuplas que califican (100 páginas, 10000 tuplas). Con un índice agrupado, el costo es un poco más de 100 I/Os; si está desagrupado, hasta 10000 I/Os! SELECT * FROM Reserves R WHERE R.rname < ‘C%’ Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 10 Proyección ! SELECT DISTINCT FROM R.sid, R.bid Reserves R La parte costosa es eliminar duplicados. " Los sistemas que usan SQL no eliminan los duplicados a menos que se incluya la palabra reservada DISTINCT en la consulta. ! Estrategias alternativas " Ordenamiento: Ordenar por <sid, bid> y eliminar duplicados. (Se puede optimizar eliminando la información no deseada mientras se ordena) " Hashing: Hash sobre <sid, bid> para crear particiones. Cargar particiones en memoria, una por vez, construir una estructura de hash en memoria, y eliminar los duplicados. ! Si hay un índice que incluya tanto R.sid como R.bid en la clave de búsqueda, podría ser más barato ordenar los datos. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 11 Reunión: Ciclos Anidados con Indice ! foreach tuple r in R do foreach tuple s in S where ri == sj do add <r, s> to result Si hay un índice en la columna de reunión para una relación S, se la puede tratar como interna y aprovechar el índice. " " ! Costo: M + ( (M*pR) * costo de encontrar las tuplas coincidentes de S) M=#páginas de R, pR=# de tuplas de R por página Por cada tupla de R, el costo de explorar el índice de S es: ~ 1.2 (hash), ~2-4 (B+ tree). El costo de encontrar las tuplas de S (suponiendo Alt. (2) o (3) para las entradas de datos) depende del agrupamiento. " Indice agrupado: 1 I/O (tipica), desagrupado: hasta 1 I/O por tupla que coincide. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 12 Ejemplos Indice Hash (Alt. 2) sobre Sailors.sid (como inner): ! " " Recorrer Reserves: 1000 I/Os de páginas, 100*1000 tuplas. Para cada tupla de Reserves: 1.2 I/Os para obtener la entrada de datos en el índice, más 1 I/O para obtener (exactamente una) tupla coincidente de Sailors. Total: 220,000 I/Os. Indice Hash (Alt. 2) sobre Reserves.sid (como inner): ! " " Recorrer Sailors: 500 I/Os de páginas, 80*500 tuplas. Para cada tupla de Sailors: 1.2 I/Os para encontrar la página del índice con las entradas de datos, más el costo de obtener las tuplas coincidentes de Reserves. Suponindo una distribución uniforme, 2.5 reservaciones por marino (sailor) -> (100,000 / 40,000). El costo de recuperarlas es 1 o 2.5 I/Os dependiendo si el índice está agrupado. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 13 Reunión: Sort-Merge (R >i=j<S) ! Ordenar R y S por la columna de reunión, luego recorrerlos para hacer una “mezcla” (merge) sobre la columna de reunión, y retornar las tuplas resultantes. " " " ! Avanzar el recorrido de R hasta que R-tupla_actual >= S-tupla, entonces avanzar el recorrido de S hasta que S-tupla_actual >= Rtupla_actual; hacerlo hasta que R-tupla = S-tupla_actual. En este punto, todas las R-tuplas con el mismo valor en Ri (grupo actual en R) y todas las S-tuplas con el mismo valor en Sj (grupo actual en S) coinciden; retornar <r, s> para todos los pares de tales tuplas. Coninuar con el recorrido de R y S. R se recorre una vez; cada grupo de S es recorrido una vez para cada tupla coincidente de . (Los múltiples recorridos de un grupo de S probablemente encontrarán las páginas necesarias en el buffer.) Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 14 Ejemplo sid 22 28 31 44 58 ! bid 103 103 101 102 101 103 day 12/4/96 11/3/96 10/10/96 10/12/96 10/11/96 11/12/96 rname guppy yuppy dustin lubber lubber dustin Costo: M log M + N log N + (M+N) " ! sname rating age dustin 7 45.0 yuppy 9 35.0 lubber 8 55.5 guppy 5 35.0 rusty 10 35.0 sid 28 28 31 31 31 58 El costo de recorrer, M+N, podría ser M*N (¡poco probable!) Con 35, 100 o 300 páginas de buffer, ambas tablas, Reserves y Sailors, pueden ser ordenadas en 2 pasadas; costo total de la reunión: 7500. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 15 Optimizador: System R ! Impacto: " ! Estimación de costos: Aproximada. " " ! Actualmente el más usado; trabaja bien para < 10 reuniones. Se usan las estadísticas, mantenidas en el catálogo del sistema, para estimar los costos de las operaciones y el tamaño de los resultados. Considera una combinación de costos de Cpu y E/S (I/O). Espacio de planes: Muy grande, debe ser acotado. " Sólo se considera el espacio de los planes “hacia la izquierda” (leftdeep). • Estos planes permiten que la salida de cada operador sea traspasada directamente (pipelined) al siguiente operador sin almacenarla en una relación temporal. " Se evitan los productos cartesianos. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 16 Estimación de Costo ! Para cada plan considerado se debe estimar el costo: " Se debe estimar el costo para cada operación en el árbol del plan. • Depende de la cardinalidad de las entradas. • El costo de cada operación se estima según lo presentado antes (recorrido secuencial, recorrido por índice, reunión, etc.) " También se debe estimar el tamaño del resultado para cada operación en el árbol. • Usando la información acerca de las relaciones de entrada. • Para las selecciones y reuniones se asume in dependencia de los predicados. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 17 Estimación de tamaño y Factores de reducción ! ! ! ! SELECT attribute list FROM relation list WHERE term1 AND ... AND Considere la consulta: termk El número máximo de tuplas en el resultado es el producto de las cardinalidades de las relaciones enumeradas en la cláusula FROM. El factor de reducción (Reduction factor - RF) asociado con cada término refleja el impacto del término en reducir el tamaño del resultado. Cardinalidad del Resultado = Max # tuplas * producto de todos los RF’s. " Supuesto implícito: los términos son independientes! " Término col=valor tiene un RF de 1/NKeys(I), dado un índice I sobre col " Término col1=col2 tiene un RF 1/MAX(NKeys(I1), NKeys(I2)) " Término col>valor tiene un RF (High(I)-valor)/(High(I)-Low(I)) Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 18 RA Tree: Ejemplo SELECT S.sname FROM Reserves R, Sailors S WHERE R.sid=S.sid AND R.bid=100 AND S.rating>5 ! ! ! ! sname rating > 5 bid=100 sid=sid Sailors Reserves Costo: 500+500*1000 I/Os (On-the-fly) ¡Y no es el peor plan posible! Plan: sname Pierde varias oportunidades: Las selecciones podrían haber sido rating > 5 (On-the-fly) bid=100 hechas antes, no se usa ningún índice, etc. (Simple Nested Loops) Meta de la optimización: Encontrar sid=sid planes más eficientes que calculen la misma respuesta. Sailors Reserves Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 19 Plan alternativo 1 (Sin Indices) ! ! Principal diferencia: posición de los selects (push selects). Con 5 buffers, costo del plan: " " " " ! ! Recorrer Reserves (1000) + escribir temp T1 (10 pags, si tenemos 100 boats con distribución uniforme). Recorrer Sailors (500) + escribir temp T2 (250 pags, si tenemos 10 ratings). Ordenar T1 (2*2*10), ordenar T2 (2*3*250), mezclar (10+250) (Scan; write to Total: 3560 pags I/Os. temp T1) (On-the-fly) sname (Sort-Merge Join) sid=sid bid=100 Si usamos reunión BNL (Block Nested Loop), Reserves la reunión cuesta = 10+4*250, costo total = 2770. Si se ‘empujan’ las projecciones, T1 sólo tiene sid, T2 sólo sid y sname: " (Scan; to temp T2) rating > 5write Sailors T1 cabe en 3 páginas, el costo de BNL cae bajo las 250 pags, total < 2000. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 20 Plan alternativo 2 (con índices) ! ! Con un índice agrupado sobre Reserves.bid, obtenemos 100,000/100 = 1000 tuplas sobre 1000/100 = 10 páginas. INL con pipelining (outer is not materialized). sname rating > 5 – Proyectar campos innecesarios desde outer no ayuda. ! La columna de reunión sid es una clave de Sailors. – A lo más una tupla coincidente, un índice no agrupado sobre sid esta OK. ! ! La decisión de no empujar rating>5 antes de la reunión se basa en la existencia de un índice sobre Sailors.sid. Costo: Selección de las tuplas de Reserves (10 I/Os); para cada una se debe obtener la tupla coincidente de Sailors (1000*1.2); total 1210 I/Os. (On-the-fly) sid=sid (Use hash index; do not write result to temp) bid=100 (On-the-fly) (Index Nested Loops, with pipelining ) Sailors Reserves Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 21 Resumen ! ! ! ! Hay varios algoritmos alternativos de evaluación para cada operador relacional. Una consulta es evaluada convirtiéndola a un árbol de operadores y evaluando los operadores en el árbol. Se debe entender la optimización de consultas para comprender a cabalidad el impacto en el rendimiento de un diseño de base de datos (relaciones e índices) sobre cierta carga de trabajo (conjunto de consultas). La optimización de una consulta tiene dos partes: " Considerar el conjutno de planes alternativos. • Se debe podar el espacio de búsqueda; típicamente se consideran solo los planes left-deep. " Se debe estimar el costo de cada plan considerado. • Se debe estimar el tamaño del resultado y el costo para cada nodo del plan. • Aspectos clave: Estadísticas, índices, implementación de operadores. Adaptado de Database Management Systems 3ed, Ch.12, R. Ramakrishnan and J. Gehrke 22