У меня есть таблица demo_fact в Oracle 11g и у него есть несколько виртуальных столбцов, определенных как таковые:
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);
Затем у меня есть материализованное представление, определенное как
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
Теперь я хочу, чтобы Query Rewrite выполнял следующий запрос:
SELECT demo_dim_one, SUM(demo_measure_from_virtual)
FROM demo_fact
GROUP BY demo_dim_one
, но это не так. Я запустил EXPLAIN_REWRITE и вот результат:
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
Предыстория: я делаю это с 70 миллионами строк и 50 виртуальными столбцами (все они имеют одинаковую структуру, простой оператор case выше, но с другим столбцом сравнения и другим столбцом результатов)
Эта проблема кажется проявляться только тогда, когда в таблице фактов есть виртуальные столбцы, но их изменение на невиртуальные потребовало бы слишком много места на диске. Почему Oracle не переписывает запрос? Что я могу сделать, чтобы это исправить?