Está en la página 1de 4

Subconsultas necesarias y funciones analticas.

EJERCICIO 11: Vuelos y compaas con la reserva mas cara. Parte II.
Dada la siguiente consulta de distintos vuelos del ejercicio 4: select c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino, max(r.importe) from vuelos v, companias c, reservas r where v.id_vuelo=r.vue_id_vuelo and r.importe in (select max (importe) from reservas where vue_id_vuelo=v.id_vuelo) and v.comp_id_comp=c.id_comp and v.comp_id_comp='KLM' and v.aer_id_aero='BCN' group by c.CN_COMP, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO;

Obtenemos los siguientes resultados: 2 ordenacin en memria 0 ordenacin en disco estimacin = 323 Coste duracin 2 segundos Mediante el siguiente plan de ejecucin:
Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=323 Card=1 Bytes=30) 1 0 SORT (GROUP BY) (Cost=323 Card=1 Bytes=30) 2 1 VIEW (Cost=322 Card=1 Bytes=30) 3 2 FILTER 4 3 SORT (GROUP BY) (Cost=322 Card=1 Bytes=63) 5 4 HASH JOIN (Cost=305 Card=2075 Bytes=130725) 6 5 HASH JOIN (Cost=164 Card=664 Bytes=31872) 7 6 NESTED LOOPS (Cost=44 Card=212 Bytes=8480) 8 7 TABLE ACCESS (BY INDEX ROWID) OF 'COMPANIAS' (Cost=1 Card=1 Bytes=18) 9 8 INDEX (UNIQUE SCAN) OF 'COMP_PK' (UNIQUE) 10 7 TABLE ACCESS (FULL) OF 'VUELOS' (Cost=43 Card=1 Bytes=22) 11 6 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=1368904) 12 5 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=2566695)

Primer paso: Anlisis de la ejecucin.


La ejecucin, realiza dos accesos a la tabla reservas. Una para realizar el clculo de la reserva mxima y la otra para la agrupacin. En este caso no es obvio el uso de la mejora, dado que se basa en el uso de una nueva funcionalidad de Oracle que aparece (y nicamente est disponible) a partir de la versin Oracle8iR3 (es decir 8.1.7) y en sta nicamente como subconsulta en la clusula FROM en la realizacin de ORDER BY. Este caso, contemplado como forma de subconsulta necesaria en el ejercicio 4, tiene una alternativa de mejora con el uso de funciones analticas.
select distinct c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino, max(r.importe) over (partition by c.cn_comp, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO order by importe desc nulls last) max_importe from where and and and vuelos v, companias c, reservas r v.id_vuelo=r.vue_id_vuelo v.comp_id_comp=c.id_comp v.comp_id_comp='KLM' v.aer_id_aero='BCN'

Las funciones analticas permiten realizar subdivisiones en lo que se considera SQL WINDOWS. El tratamiento de cada fila se realiza en base a la particin afectada. El uso de funciones analticas mejora el procesamiento de SQL con subconsultas que resuelven funciones de grupo como MAX, MIN, AVG, ROW_NUMBER, etc.
Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=177 Card=664 Bytes=24568) 1 0 SORT (UNIQUE) (Cost=177 Card=664 Bytes=24568) 2 1 WINDOW (SORT) (Cost=177 Card=664 Bytes=24568) 3 2 HASH JOIN (Cost=164 Card=664 Bytes=24568) 4 3 NESTED LOOPS (Cost=44 Card=212 Bytes=6148) 5 4 TABLE ACCESS (BY INDEX ROWID) OF 'COMPANIAS' (Cost=1 Card=1 Bytes=14) 6 5 INDEX (UNIQUE SCAN) OF 'COMP_PK' (UNIQUE) 7 4 TABLE ACCESS (FULL) OF 'VUELOS' (Cost=43 Card=1 Bytes=15) 8 3 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=1368904)

La comparativa de costes de la traza demuestra la ganancia de tiempos con sta tcnica.

Segundo paso: Comparativa de tiempos y costes.


Sentencia usando SUBCONSULTAS.
select c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino, max(r.importe) from vuelos v, companias c, reservas r where v.id_vuelo=r.vue_id_vuelo and r.importe in (select max (importe) from reservas where vue_id_vuelo=v.id_vuelo) and v.comp_id_comp=c.id_comp and v.comp_id_comp='KLM' and v.aer_id_aero='BCN' group by c.CN_COMP, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO

call count ------- -----Parse 3 Execute 3 Fetch 12 ------- -----total 18

cpu elapsed disk query current -------- ---------- ---------- ---------- ---------0.00 0.03 0 0 0 0.00 0.01 0 0 0 0.45 6.17 8052 8100 0 -------- ---------- ---------- ---------- ---------0.45 6.22 8052 8100 0

rows ---------0 0 99 ---------99

Sentencia usando FUNCIONES ANALTICAS.


select distinct c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino, max(r.importe) over (partition by c.cn_comp, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO order by importe desc nulls last) max_importe from vuelos v, companias c, reservas r where v.id_vuelo=r.vue_id_vuelo and v.comp_id_comp=c.id_comp and v.comp_id_comp='KLM' and v.aer_id_aero='BCN' call count ------- -----Parse 2 Execute 2 Fetch 8 ------- -----total 12 cpu elapsed disk query current -------- ---------- ---------- ---------- ---------0.01 0.00 0 0 0 0.00 0.00 0 0 0 0.20 2.65 3116 3138 0 -------- ---------- ---------- ---------- ---------0.21 2.65 3116 3138 0 rows ---------0 0 66 ---------66

Resumen de la prctica.

Oracle ofrece un conjunto de funciones analticas para mejorar las ejecuciones de subconsultas en los clculos de subtotales en agrupaciones internas complejas. Las funciones analticas siguen la siguiente estructura:

FUNCION( <argumento1>,<argumento2>, ) OVER ( <particin> <order by > <clusula de agrupacin> )

La subdivisin de registros se define en la clusula de particin, y la funcin se aplica para cada fila al grupo de esta subdivisin. En base a la premisa anterior, ATENCIN A LOS DUPLICADOS. En una subdivisin de 10 elementos, calcular el mximo de la particin devolvera 10 filas iguales aunque los clculos sean correctos. Cada particin puede implicar un rea de almacenamiento aparte y cada clusula ORDER BY dentro de cada funcin puede implicar una ordenacin adicional. Es preciso la comprensin de la ejecucin y, a su vez, el SQL convencional necesario para su ejecucin. La clusula ORDER BY es obligatoria en algunas funciones analticas. p.e. row_number()

También podría gustarte