BANCO DE DADOS II IMPLEMENTAO E OPTIMIZAO DE
BANCO DE DADOS II IMPLEMENTAÇÃO E OPTIMIZAÇÃO DE BANCOS DE DADOS Funções agregadas de ventana. Cláusula WITH e Cláusula OVER Ms. C. Leoder Alemañy Socarrás
BASES DE DATOS ACTUALES ¿Como crêem vocês que serão os tempos de resposta em consultas que requeiram da execução de subconsultas? ¿Como poderiam melhorar estes tempos de resposta para recuperar a mesma informação?
OBJETIVOS Descrever a estrutura e funcionamento das funções agregadas. A cláusula WITH e a cláusula OVER.
RESUMEN Diseño de Bases de Datos: Modelo Entidad – Relación. � Normalización � Patrones de diseño � Transformación Implementación de Bases de Datos: Lenguaje SQL � DML (Select, Insert, Delete, Update) � DCL � DDL (Create, Drop, Alter) Funciones y Vistas.
RESUMEN Implementación de Bases de Datos: Cláusula SELECT Select …. (Funciones Agregadas) From …. . Tabla 1 INNER JOIN Tabla 2…. . ON…. Where…. . (Subconsultas, LIKE…) Group By Having (condición con funciones agregadas) Order By … ASC…. DESC…. Funciones MIN, SUM Agregadas: COUNT, AVG, MAX,
FUNCIÓN DE VENTANA Una función ventana es una función agregada aplicada a una partición o subconjunto del resultado de una consulta, que devuelve un valor por cada fila del resultado. Están disponibles en sistemas gestores de bases de datos como Oracle, SQL Server, Sybase y DB 2, pero en ninguna base de datos de código abierto, exceptuando Postgre. SQL a partir de la versión 8. 4
¿POR QUÉ USAR FUNCIONES VENTANAS? Empleado (empid, departamento, salario, edad)
PREGUNTA ¿Qual é a diferença do salário da cada um dos empregados com respeito à média de seu departamento?
SOLUCIÓN SELECT e 1. empid, e 1. departamento, e 1. salario, e 1. edad, (SELECT AVG(e 2. salario) FROM empleado e 2 WHERE e 2. departamento=e 1. departamento ) as promedio FROM empleado e 1;
¿É A SOLUÇÃO ÓPTIMA? Esta solución nos mostraría los datos de cada empleado con el promedio de salario del departamento al que él corresponde. Sin embargo con el uso de las "funciones ventanas" la solución sería más simple y los tiempos de respuestas serían menores.
DIFERENCIAS ENTRE EL USO DE LAS FUNCIONES VENTANA Y EL USO DELGROUP BY Con el GROUP BY obtenemos un resultado con una fila por cada valor diferente del atributo usado en el GROUP BY.
FUNCIONES DE VENTANA Uma función ventana devolve um valor pela cada bicha do resultado de uma consulta.
SINTAXIS DE LAS FUNCIONES VENTANAS OVER( [PARTITION [ORDER BY expresion [, . . . ]] BY expression [ASC|DESC][NULLS{FIRST|LAST}][, . . . ]] [Frame-Clause] )
PARÁMETROS Partition by: Realiza la separación lógica de las N clases que componen la partición creada de acuerdo a la expresión definida. Order by: Especifica la manera en que se ordenaran los datos dentro de la clase. Este elemento es de vital importancia en un grupo importante de casos.
CLÁUSULA FRAME La definición del frame es uno de los elementos más importantes cuando se utilizan funciones de ventana. En el frame se define el conjunto de filas que se tendrán en cuenta para computar el resultado de la función analítica, en aquellos casos en que se opere sobre una parte de los datos y no sobre toda la clase.
SINTAXIS DE FRAME-CLAUSE [ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end Y los valores que pueden ser asignados son los siguientes: UNBOUNDED PRECEDING value PRECEDING CURRENT ROW value FOLLOWING UNBOUNDED FOLLOWING
EJEMPLO 1 Mostrar el empid, departamento, salario, edad y el promedio de los salarios por departamento, para poder realizar la comparación. SELECT empid, departamento, salario, edad, avg (salario) OVER (PARTITION BY departamento) AS promedio FROM empleado;
RESULTADOS Mostrar el empid, departamento, salario, edad y el promedio de los salarios por departamento, para poder realizar la comparación.
EJEMPLO 1. 1 Mostrar el empid, departamento, salario, edad, el promedio de los salarios y el promedio de las edades por departamento, para poder realizar la comparación. SELECT empid, departamento, salario, edad, avg (salario) OVER (PARTITION BY departamento) AS sal_medio, avg (edad) OVER (PARTITION BY departamento) AS ed_media FROM empleado
RESULTADOS
EJEMPLO 2 Calcular el promedio de los salarios teniendo en cuenta la fila actual más los salarios de las dos filas siguientes que pertenecen a la partición. SELECT empid, departamento, salario, edad, avg (salario) OVER (PARTITION BY departamento ORDER BY ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING ) AS salario_medio FROM empleado
RESULTADOS
MÁS FUNCIONES AGREGADAS row_number() percent_rank() last_value() rank() dense_rank() first_value()
ROW NUMBER Computa un número de fila secuencial comenzando con 1 en la primera tupla en cada partición y de acuerdo al ordenamiento de las tuplas en la partición. Enumerar los empleados por cada tipo de departamento. SELECT departamento, salario, edad , ROW_NUMBER() OVER (PARTITION BY departamento) FROM empleado;
RESULTADOS
RANK Es el rango o jerarquía que ocupa una tupla R teniendo en cuenta las tuplas que la preceden. El rango si encuentra dos tuplas en una posición empatada, les asigna el mismo número. Mostrar el lugar que ocupan los empleados ordenados por la edad. SELECT departamento, salario, edad , Rank() OVER (order by edad) FROM empleado;
RESULTADOS
RANK Mostrar el lugar que ocupan los empleados ordenados por la edad dentro de su departamento. SELECT departamento, salario, edad , Rank() OVER (PARTITION BY departamento order by edad ) FROM empleado;
RESULTADOS
DENSERANK El DENSERANK (rango denso) otorga un número de orden a la tupla en dependencia de su puesto en el ordenamiento sin dejar saltos en la numeración. Ejemplo: Mostrar el lugar que ocupan los empleados ordenados por la edad. SELECT departamento, salario, edad , dense_Rank() OVER (order by edad ) FROM empleado;
RESULTADOS
DENSERANK Ejemplo: Mostrar el lugar que ocupan los empleados ordenados por la edad dentro de su departamento. SELECT departamento, salario, edad , dense_Rank() OVER (PARTITION BY departamento order by edad ) FROM empleado;
RESULTADOS
PERCENT_RANK Devuelve el ranking relativo (rank() – 1) / (total de filas - 1) SELECT departamento, salario, edad , percent_rank() OVER (order by edad ) FROM empleado;
RESULTADOS
PERCENT_RANK Mostrar el ranking relativo que ocupan los empleados ordenados por la edad dentro de su departamento. SELECT departamento, salario, edad , percent_rank() OVER (PARTITION BY departamento order by edad ) FROM empleado;
RESULTADOS
LAST_VALUE Devuelve el último valor del marco de la ventana para el atributo indicado. Ejemplo: Mostrar los datos de cada empleado y la mayor edad del departamento a que pertenecen. SELECT departamento, salario, edad, last_value(edad) OVER (PARTITION BY departamento order by edad ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM empleado;
RESULTADOS
FIRST_VALUE Devuelve el primer valor del marco de la ventana para el atributo indicado. Ejemplo: Mostrar los datos de cada empleado y la menor edad del departamento a que pertenecen. SELECT departamento, salario, edad, first_value(edad) OVER (PARTITION BY departamento order by edad ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM empleado;
RESULTADOS
Conclusiones
CLÁUSULA WITH La cláusula WITH permite especificar una o más subconsultas que serán referenciadas por su nombre en la consulta principal. Una propiedad útil de las consultas WITH es que son evaluadas solo una vez por cada ejecución de la consulta principal, aún si la consulta primaria se refiere a ellas más de una vez.
CLÁUSULA WITH Consultas Recursivas. Optimización de Consultas.
SINTAXIS [ WITH [ RECURSIVE ] SELECT [ FROM ] [ WHERE ] [ GROUP BY] [ HAVING] [ORDER BY]
CONSULTAS RECURSIVAS Es una consulta que hace referencia a su salida a partir del uso de la cláusula with. WITH RECURSIVE nombretabla (<lista de columnas>) AS ( < caso base> [UNION|INTERSECT] [ALL|DISTINCT] <paso recursivo> )
OPTIMIZACIÓN DE CONSULTAS Es una consulta que hace referencia a su salida a partir del uso de la cláusula with. WITH <alias_name> AS (sql_subquery_statement) SELECT column_list FROM <alias_name>[, tablename] [WHERE <join_condition>]
OPTIMIZAR EL RENDIMIENTO DE CONSULTAS ¿Cuál es la diferencia del salario de cada uno de los empleados con respecto a la media de su departamento? SELECT e 1. empid, e 1. departamento, e 1. salario, e 1. edad, (select avg(e 2. salario) from empleado e 2 where e 2. departamento=e 1. departamento ) as promedio FROM empleado e 1;
UTILIZANDO LA CLÁUSULA WITH departamento_salario as (SELECT e 2. departamento, AVG(e 2. salario) as salario_promedio FROM empleado e 2 GROUP BY departamento) SELECT e 1. empid, e 1. departamento, e 1. salario, e 1. edad, departamento_salario_promedio FROM empleado e 1, departamento_salario WHERE departamento_salario. departamento = e 1. departamento;
RESULTADO
OPTIMIZAR EL RENDIMIENTO DE CONSULTAS Mostrar para cada empleado, además del salario promedio de su departamento, la edad promedio en el departamento de cada uno. SELECT e 1. empid, e 1. departamento, e 1. salario, e 1. edad, (select avg(e 2. salario) from empleado e 2 where e 2. departamento=e 1. departamento ) as salario_promedio, (select avg(e 3. edad) from empleado e 3 where e 3. departamento=e 1. departamento ) as edad_promedio FROM empleado e 1;
UTILIZANDO LA CLÁUSULA WITH departamento_salario as (SELECT e 2. departamento, AVG(e 2. salario) as salario_promedio FROM empleado e 2 GROUP BY departamento), departamento_edad as (SELECT e 3. departamento, AVG(e 3. edad) as edad_promedio FROM empleado e 3 GROUP BY departamento) SELECT e 1. empid, e 1. departamento, e 1. salario, e 1. edad, departamento_salario_promedio, departamento_edad_promedio FROM empleado e 1, departamento_salario, departamento_edad WHERE departamento_salario. departamento = e 1. departamento AND e 1. departamento = departamento_edad. departamento;
RESULTADOS
PLANIFICADOR DE CONSULTAS Se puede usar para mostrar el plan de ejecución que el planificador genera para una consulta dada. Sintaxis: EXPLAIN PLAN FOR <query>
UTILIDAD DEL PLANIFICADOR O uso deste comando é importantíssimo para analisar a optimização de consultas quando se utilizam funciones de ventanas ou a cláusula WITH. Para isso se deve analisar o plano de consulta com a resposta em sql básico e depois com a variante que se tenha eleito para a optimização dependendo do caso.
Conclusiones
ESTUDIO INDEPENDIENTE PERCENT_RANK LAST_VALUE FIRST_VALUE Consultas Recursivas utilizando la cláusula WITH Uso del planificador de consultas para comparar el rendimiento de dos consultas.
ESTUDIO INDEPENDIENTE Utilizando el script entregado para el estudio independiente, ejecuten el planificador de consultas para los ejemplos de la conferencia en sql básico y utilizando funciones de ventana o cláusula WITH, con el objetivo de analizar las variaciones en los tiempos de respuesta.
- Slides: 59