У меня есть таблица, demo_fact в Oracle 11g, и она имеет несколько виртуальных столбцов, определенных в качестве таковых:Oracle переписывание запросов с виртуальными столбцов в исходной таблице
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 виртуальных колонок (все они имеют ту же структуру, простое утверждение случая выше, но с другой столбец сравнения и другой столбец результатов)
Эта проблема, по-видимому, проявляется только в том случае, когда таблица фактов имеет виртуальные столбцы, но изменение их на не-виртуальное будет потреблять слишком много дискового пространства. Почему Oracle не переписывает запрос? Что я могу сделать, чтобы исправить это?
Отличное объяснение! Спасибо, что нашли время. Не повезло, что я работаю с SAP BusinessObjects, поэтому я надеялся использовать не-вложенный запрос. Я отмечу это как принятый ответ, чтобы объяснить это так хорошо и быстро. –