Configure a Schema to Support a Star Transformation Query

1. Documentación en Tahiti -> Masters Book List -> Data Warehousing Guide -> 20 Schema Modeling Techniques -> Star Schemas

2. Es bastante habitual en BBDD de tipo Data Warehouse tener esquemas en estrella. Una tabla de hechos (FACT TABLE) se relaciona con varias tablas de dimensiones (DIMENSION TABLES). En la documentación se da una explicación bastante buena de como son estos STAR SCHEMAS y en qué consiste la característica de Oracle de “Star Transformation”.

Las directrices importantes que debemos seguir para poder optimizar sentencias en estrella son la utilización de índices Bitmap para cada una de las claves foraneas de la tabla de hechos y habilitar el parámetro STAR_TRANSFORMATION_ENABLED, que está fijado por defecto a FALSE. Vamos a ver como habilitarlo y comprobarlo.

-- Antes de habilitar la optimización de STAR QUERIES vamos a coger una consulta de ejemplo
-- Revisamos el valor del parámetro STAR_TRANSFORMATION_ENABLED (por defecto FALSE)
SHOW PARAMETER STAR_TRANSFORMATION_ENABLED

-- Habilitamos la visualización del plan de ejecución
SET AUTOT TRACE EXPLAIN

-- Lanzamos la consulta de la documentación para ver el plan de ejecución
-- Basicamente son varios HASH JOIN encadenados de las tablas implicadas
SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,
   SUM(s.amount_sold) sales_amount
FROM sh.sales s, sh.times t, sh.customers c, sh.channels ch
WHERE s.time_id = t.time_id
AND   s.cust_id = c.cust_id
AND   s.channel_id = ch.channel_id
AND   c.cust_state_province = 'CA'
AND   ch.channel_desc in ('Internet','Catalog')
AND   t.calendar_quarter_desc IN ('1999-01','1999-02')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;

-- Habilitamos el parámetro STAR_TRANSFORMATION_ENABLED para toda la BD
-- Se puede habilitar sólo para la sesión en curso (ALTER SESSION)
ALTER SYSTEM SET STAR_TRANSFORMATION_ENABLED=TRUE;

Volvemos a lanzar la consulta para ver el nuevo plan optimizado. El nuevo plan utilizar los índices Bitmap de las tablas de Dimensiones para obtener el conjunto de regitros filtrados de la tabla SALES. Una vez obtenido, hace un JOIN con las tablas de dimensiones para obtener los campos seleccionados. Además, si nos fijamos en el apartado “Note”, nos indican que se ha utilizado una transformación en estrella.

-- Lanzamos la consulta otra vez para ver el nuevo plan de ejecución optimizado
-- El coste de la consulta ha bajado considerablmente, así como el número de bloques a leer
-- Esta optimización puede proporcionar mejoras de tiempo enormes en un DW
SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,
   SUM(s.amount_sold) sales_amount
FROM sh.sales s, sh.times t, sh.customers c, sh.channels ch
WHERE s.time_id = t.time_id
AND   s.cust_id = c.cust_id
AND   s.channel_id = ch.channel_id
AND   c.cust_state_province = 'CA'
AND   ch.channel_desc in ('Internet','Catalog')
AND   t.calendar_quarter_desc IN ('1999-01','1999-02')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;

3. Podemos forzar la optimización de la transformación en estrella utilizando el Hint STAR_TRANSFORMATION.

-- Deshabilitamos el parámetro STAR_TRANSFORMATION_ENABLED
ALTER SYSTEM SET STAR_TRANSFORMATION_ENABLED=FALSE;

-- Habilitamos la visualización del plan de ejecución
SET AUTOT TRACE EXPLAIN

-- Lanzamos la consulta con el Hint STAR_TRANSFORMATION
SELECT /*+ STAR_TRANSFORMATION */ ch.channel_class, c.cust_city, t.calendar_quarter_desc,
   SUM(s.amount_sold) sales_amount
FROM sh.sales s, sh.times t, sh.customers c, sh.channels ch
WHERE s.time_id = t.time_id
AND   s.cust_id = c.cust_id
AND   s.channel_id = ch.channel_id
AND   c.cust_state_province = 'CA'
AND   ch.channel_desc in ('Internet','Catalog')
AND   t.calendar_quarter_desc IN ('1999-01','1999-02')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;

4. La transformación en estrella no está soportado bajo ciertas condiciones (lista completa en documentación):

· Sentencias con HINTS incompatibles con operaciones de tipo BITMAP ACCESS
· Sentencias que contengan BIND VARIABLES
· Tablas con insuficientes indíces BITMAP. Debe haber uno por cada subquery necesaria para la transformación
· Tablas de hechos remotas
· Tablas ANTI-JOIN
· Tablas que ya están utilizando una tabla de dimensiones en una subquery