我在 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
现在我希望查询重写启动以下查询:
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 个虚拟列(它们都具有相同的结构,上面的简单 case 语句,但具有不同的比较列和不同的结果列)
这个问题似乎只在事实表具有虚拟列时才会出现,但是将它们更改为非虚拟会消耗太多磁盘空间。为什么 Oracle 不重写查询?我能做些什么来修复它?