Перезапись запроса Oracle с виртуальными столбцами в исходной таблице

У меня есть таблица 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 не переписывает запрос? Что я могу сделать, чтобы это исправить?

6
задан Gudmundur Orn 31 January 2011 в 17:18
поделиться