Está en la página 1de 6

Abuso de subconsultas.

EJERCICIO 3: Vuelos y compaas con la reserva mas cara.

Dada la siguiente consulta: SQL> select distinct c.CN_COMP compania, 2 v.AER_ID_AERO origen, 3 v.AER_ID_AERO_DESTINO destino 4 from vuelos v, companias c 5 where id_vuelo in (select vue_id_vuelo 6 from reservas 7 where importe in (select max (importe) 8 from reservas)) 9 and v.comp_id_comp=c.id_comp;

Obtenemos los siguientes resultados: en devolver 7 filas 2250 lecturas fsicas 1 ordenacin en memria 0 ordenaciones en disco estimacin = 132 Coste tiempo = 1 Segundo

Primer paso: Estudio de la ejecucin.


Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=132 Card=17 Bytes=629) 1 0 SORT (UNIQUE) (Cost=132 Card=17 Bytes=629) 2 1 HASH JOIN (Cost=130 Card=17 Bytes=629) 3 2 NESTED LOOPS (Cost=127 Card=17 Bytes=391) 4 3 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=17 Bytes=136) 5 4 SORT (AGGREGATE) 6 5 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=684452) 7 3 TABLE ACCESS (BY INDEX ROWID) OF 'VUELOS' (Cost=1 Card=1 Bytes=15) 8 7 INDEX (UNIQUE SCAN) OF 'VUE_PK' (UNIQUE) 9 2 TABLE ACCESS (FULL) OF 'COMPANIAS' (Cost=2 Card=8 Bytes=112)

Anlisis de la ejecucin: Acceso a Reservas para cmputo de la reserva ms cara. Bsqueda de reservas para extraer el cdigo de los vuelos con ese precio y recorrido mediante el ndice de vuelos a los datos de los vuelos. Una vez recuperados los registros, realiza una combinacin hash para, despus, ordenar los resultados y eliminar duplicados. El siguiente cdigo podra optimizarse para una mejor comprensin de la siguiente forma:
select distinct c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino from vuelos v, companias c, reservas r where v.id_vuelo=r.vue_id_vuelo and r.importe in (select max (importe) from reservas) and v.comp_id_comp=c.id_comp;

El plan de ejecucin resultante ES IDNTICO.

Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=132 Card=17 Bytes=629) 1 0 SORT (UNIQUE) (Cost=132 Card=17 Bytes=629) 2 1 HASH JOIN (Cost=130 Card=17 Bytes=629) 3 2 NESTED LOOPS (Cost=127 Card=17 Bytes=391) 4 3 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=17 Bytes=136) 5 4 SORT (AGGREGATE) 6 5 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=684452) 7 3 TABLE ACCESS (BY INDEX ROWID) OF 'VUELOS' (Cost=1 Card=1 Bytes=15) 8 7 INDEX (UNIQUE SCAN) OF 'VUE_PK' (UNIQUE) 9 2 TABLE ACCESS (FULL) OF 'COMPANIAS' (Cost=2 Card=8 Bytes=112)

Reducir esa subconsulta facilitar la comprensin del cdigo, pero no es necesario realizar dos accesos a la tabla reservas. En una primera carga ya podra filtrarse ese importe y resultar el siguiente cdigo utilizando funciones analticas para una subconsulta en la clusula FROM.
select vue_id_vuelo, rank() over (order by importe desc nulls last) r from reservas where r=1

select vue_id_vuelo from (select vue_id_vuelo, importe, max(importe) over (order by importe desc nulls last) max_importe from reservas) where importe=max_importe

En este ejemplo, dado que no existen divisiones de particiones en el clculo de las funciones analticas, los cambios no producen ningn beneficio en el coste.
select distinct c.CN_COMP compania, v.AER_ID_AERO origen, v.AER_ID_AERO_DESTINO destino from vuelos v, companias c, ( select vue_id_vuelo, rank() over (order by importe desc nulls last) r from reservas) r where v.id_vuelo=r.vue_id_vuelo and r.r=1 and v.comp_id_comp=c.id_comp;
Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6338 Card=4624 Bytes=212704) 1 0 SORT (UNIQUE) (Cost=6338 Card=4624 Bytes=212704) 2 1 HASH JOIN (Cost=1528 Card=171113 Bytes=7871198) 3 2 TABLE ACCESS (FULL) OF 'COMPANIAS' (Cost=2 Card=8 Bytes=112) 4 2 HASH JOIN (Cost=1516 Card=171113 Bytes=5475616) 5 4 TABLE ACCESS (FULL) OF 'VUELOS' (Cost=43 Card=57711 Bytes=865665) 6 4 VIEW (Cost=1208 Card=171113 Bytes=2908921) 7 6 WINDOW (SORT PUSHED RANK) (Cost=1208 Card=171113 Bytes=1368904) 8 7 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=1368904)

Obtenemos los siguientes resultados: en devolver 7 filas 1737 lecturas fsicas 1 ordenacin en memria 1 ordenaciones en disco estimacin = 6338 Coste tiempo = 2 Segundos Esta diferencia en el coste no debe alarmar. El coste total de la ejecucin es nicamente de 2 segundos, respecto a un segundo de la ejecucin primera. La sentencia es distinta, y la comparativa en la estimacin del coste no puede compararse directamente.

Abuso de subconsultas.

EJERCICIO 4: Vuelos y compaas con la reserva mas cara incluyendo el precio de sta.

Dada la siguiente consulta: SQL> r 1 select c.CN_COMP compania, 2 v.AER_ID_AERO origen, 3 v.AER_ID_AERO_DESTINO destino, 4 max(r.importe) 5 from reservas r, vuelos v, companias c 6 where id_vuelo in (select vue_id_vuelo 7 from reservas 8 where importe in (select max (importe) 9 from reservas)) 10 and v.comp_id_comp=c.id_comp 11 and v.id_vuelo=r.vue_id_vuelo 12* group by c.CN_COMP, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO

Obtenemos los siguientes resultados: en devolver 7 filas 3375 lecturas fsicas 1 ordenacin en memria 0 ordenaciones en disco estimacin = 247 Coste tiempo = 2 Segundos

Primer paso: Estudio de la ejecucin.


Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=247 Card=51 Bytes=2295) 1 0 SORT (GROUP BY) (Cost=247 Card=51 Bytes=2295) 2 1 HASH JOIN (Cost=245 Card=51 Bytes=2295) 3 2 HASH JOIN (Cost=130 Card=17 Bytes=629) 4 3 NESTED LOOPS (Cost=127 Card=17 Bytes=391) 5 4 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=17 Bytes=136) 6 5 SORT (AGGREGATE) 7 6 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=684452) 8 4 TABLE ACCESS (BY INDEX ROWID) OF 'VUELOS' (Cost=1 Card=1 Bytes=15) 9 8 INDEX (UNIQUE SCAN) OF 'VUE_PK' (UNIQUE) 10 3 TABLE ACCESS (FULL) OF 'COMPANIAS' (Cost=2 Card=8 Bytes=112) 11 2 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=1368904)

Anlisis de la ejecucin: Acceso a Reservas para cmputo de la reserva ms cara. Bsqueda de reservas para extraer el cdigo de los vuelos con ese precio y recorrido mediante el ndice de vuelos a los datos de los vuelos. Una vez recuperados los registros, realiza una combinacin hash para, despus de obtener el importe de la reserva ms cara, ordenar los resultados y eliminar duplicados. Hay una subconsulta innecesaria. Es decir, una subconsulta perjudica el rendimiento aadiendo un acceso evitable a la tabla reservas. El siguiente cdigo podra optimizarse de la siguiente forma:
SQL> select c.CN_COMP compania, 2 v.AER_ID_AERO origen, 3 v.AER_ID_AERO_DESTINO destino, 4 max(r.importe) 5 from vuelos v, companias c, reservas r 6 where r.importe in (select max (importe) 7 from reservas) 8 and v.comp_id_comp=c.id_comp 9 and v.id_vuelo=r.vue_id_vuelo 10* group by c.CN_COMP, v.AER_ID_AERO, v.AER_ID_AERO_DESTINO

Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=132 Card=17 Bytes=629) 1 0 SORT (GROUP BY) (Cost=132 Card=17 Bytes=629) 2 1 HASH JOIN (Cost=130 Card=17 Bytes=629) 3 2 NESTED LOOPS (Cost=127 Card=17 Bytes=391) 4 3 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=17 Bytes=136) 5 4 SORT (AGGREGATE) 6 5 TABLE ACCESS (FULL) OF 'RESERVAS' (Cost=110 Card=171113 Bytes=684452) 7 3 TABLE ACCESS (BY INDEX ROWID) OF 'VUELOS' (Cost=1 Card=1 Bytes=15) 8 7 INDEX (UNIQUE SCAN) OF 'VUE_PK' (UNIQUE) 9 2 TABLE ACCESS (FULL) OF 'COMPANIAS' (Cost=2 Card=8 Bytes=112)

Obtenemos los siguientes resultados: en devolver 7 filas 1 ordenacin en memria 0 ordenaciones en disco estimacin = 132 Coste tiempo = 1 Segundo

Resumen de la prctica.

Como norma general, el optimizador de Oracle interpretar subconsultas innecesarias omitiendo accesos redundantes. Para clarificar la lectura de las sentencias y para reducir costes de interpretacin, es conveniente reducir las consultas a las nicamente necesarias para la ejecucin. El optimizador puede no interpretar correctamente subconsultas innecesarias en sentencias SQL extensas. Esto puede afectar a que no se utilice el plan de ejecucin ptimo. Reducir las subconsultas puede mejorar el rendimiento a causa de facilitar el trabajo al optimizador. En algunos casos, las subconsultas pueden omitirse mediante el uso de funciones analticas. El objeto de stas es la de realizar clculos con subgrupos de la informacin en la recuperacin de las filas. Si se usan para otro propsito puede obtenerse un plan de ejecucin ms lento.

También podría gustarte