Oracle 11g にテーブル demo_fact があり、そのように定義されたいくつかの仮想列があります。
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
バックストーリー: 私は 70M 行と 50 個の仮想列でこれを行っています (それらはすべて同じ構造で、上記の単純なケース ステートメントを持っていますが、比較列と結果列が異なります)。
この問題は、ファクト テーブルに仮想列がある場合にのみ発生するようですが、それらを非仮想列に変更すると、ディスク領域が大量に消費されます。Oracle がクエリを書き換えないのはなぜですか? 修正するにはどうすればよいですか?