sábado, 22 de octubre de 2011

Qué es el Query Rewrites?



El Query Rewrites es la capacidad que tiene el optimizador (en base a ciertos parámetros) de usar las tablas o las vistas maternizadas. Veamos un pequeño ejemplo:

1) Crear la vista materializada.

    CREATE MATERIALIZED VIEW cal_month_sales_mv
    FROM sales s, times t WHERE s.time_id = t.time_id
    ENABLE QUERY REWRITE AS
    SELECT t.calendar_month_desc, SUM(s.amount_sold) AS dollars
    FROM sales s, times t WHERE s.time_id = t.time_id
  5      GROUP BY t.calendar_month_desc
  6  /

Materialized view created.

2) Revisar los parámetros de configuración

SQL> show parameter query_rewrite_enabled   

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled                string      FALSE


Dependiendo de la versión de BD donde se esté trabajando el valor por defecto de este parámetro puede ser TRUE (OPTIMIZER_FEATURES_ENABLE >= 10.0.0 ) o FALSE (OPTIMIZER_FEATURES_ENABLE <=  9.2.0). En nuestro caso de ejemplo el parámetro se encuentra en FLASE.

3) Evaluar la consulta que genera la vista materializada.

SQL> explain plan for
    SELECT t.calendar_month_desc, SUM(s.amount_sold) AS dollars
    FROM sales s, times t WHERE s.time_id = t.time_id
  4      GROUP BY t.calendar_month_desc
  5  /

------------------------------------------------------------------------------------------
| Id  | Operation             |  Name       | Rows  | Bytes | Cost (%CPU)| Pstart| Pstop |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |    48 |  1344 |   511   (8)|       |       |
|   1 |  SORT GROUP BY        |             |    48 |  1344 |   511   (8)|       |       |
|*  2 |   HASH JOIN           |             |  1015K|    27M|   487   (3)|       |       |
|   3 |    TABLE ACCESS FULL  | TIMES       |  1461 | 23376 |     7  (15)|       |       |
|   4 |    PARTITION RANGE ALL|             |       |       |            |     1 |    16 |
|   5 |     TABLE ACCESS FULL | SALES       |  1015K|    11M|   477   (2)|     1 |    16 |
------------------------------------------------------------------------------------------

En este caso se puede evidenciar que el optimizador accede directamente a las tablas SALES y TIMES sobre las cuales se genera la vista materialziada cal_month_sales_mv.

4) Que empiece la magia, simplemente alteremos el parameter query_rewrite_enabled.

SQL> alter system set query_rewrite_enabled=TRUE;

System altered.

5) Veamos que hace el optimizador ahora:

SQL> explain plan for
    SELECT t.calendar_month_desc, SUM(s.amount_sold) AS dollars
    FROM sales s, times t WHERE s.time_id = t.time_id
  4      GROUP BY t.calendar_month_desc
  5  /

---------------------------------------------------------------------------------
| Id  | Operation            |  Name               | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                     |   327 |  6213 |     3  (34)|
|   1 |  TABLE ACCESS FULL   | CAL_MONTH_SALES_MV  |   327 |  6213 |     3  (34)|
---------------------------------------------------------------------------------

Entonces que es el Query Rewrites y que bondades tiene? Esta funcionalidad le permitirle al optimizador usar las vistas materializadas (en lugar de las tablas bases) que cumplan exactamente con la consulta que se esté ejecutando.


No hay comentarios: