Tengo una tabla, demo_fact en Oracle 11g y tiene varias columnas virtuales definidas como tales:Oracle reescritura de consultas con columnas virtuales en la tabla de origen
ALTER TABLE demo_fact ADD (demo_measure_from_virtual NUMBER GENERATED ALWAYS AS
(CASE WHEN demo_category_column = 20 THEN demo_numericdata_column ELSE 0 END)
VIRTUAL VISIBLE);
entonces tengo una vista materializada definida como
CREATE MATERIALIZED VIEW demo_agg_mv
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE
AS
SELECT
demo_dim_one,
demo_dim_two,
SUM(demo_measure_from_virtual) demo_measure_from_virtual
FROM demo_fact
GROUP BY demo_dim_one, demo_dim_two
Ahora quiero reescritura de consultas en arrancar en la siguiente consulta:
SELECT demo_dim_one, SUM(demo_measure_from_virtual)
FROM demo_fact
GROUP BY demo_dim_one
pero no es así. Corrí en EXPLAIN_REWRITE y aquí está la salida:
QSM-01150: query did not rewrite
QSM-01102: materialized view, DEMO_AGG_MV, requires join back to table,
DEMO_FACT, on column, DEMO_MEASURE_FROM_VIRTUAL
QSM-01082: Joining materialized view, DEMO_AGG_MV, with table, DEMO_FACT,
not possible
QSM-01102: materialized view, DEMO_AGG_MV, requires join back to table,
DEMO_FACT, on column, DEMO_NUMERICDATA_COLUMN
Historia: Estoy haciendo esto con 70 millones de filas y 50 columnas virtuales (todos ellos tienen la misma estructura, la declaración simple caso anterior, pero con un diferente columna de comparación y una columna de resultados diferente)
Este problema parece manifestarse solo cuando la tabla de hechos tiene columnas virtuales, pero cambiarlas a no virtuales consumiría demasiado espacio de disco. ¿Por qué Oracle no está reescribiendo la consulta? ¿Que puedo hacer para arreglarlo?
¡Gran explicación! Gracias por tomarse el tiempo. Desafortunadamente para mí, estoy trabajando con SAP BusinessObjects, así que esperaba usar una consulta no anidada. Marcaré esto como una respuesta aceptada para explicarlo tan bien y con prontitud. –