Mam tabeli, demo_fact w Oracle 11g i ma kilka kolumn wirtualnych zdefiniowane jako takie:Oracle zapytanie przepisać z wirtualnych kolumn w tabeli źródłowej
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);
to mam zmaterializował widok zdefiniowany jako
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
teraz chcę Query Rewrite kopać w dniu następującym zapytaniem:
SELECT demo_dim_one, SUM(demo_measure_from_virtual)
FROM demo_fact
GROUP BY demo_dim_one
ale tak nie jest. Pobiegłem EXPLAIN_REWRITE na i tu jest wyjście:
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
Historia: Robię to z 70m wierszy i 50 kolumn wirtualnych (wszystkie z nich mają taką samą strukturę, prostą instrukcję case powyżej, ale z innym kolumna porównania i inna kolumna wyników)
Ten problem pojawia się tylko wtedy, gdy tabela faktów zawiera wirtualne kolumny, ale zmiana ich na niewirtualną spowoduje zużycie zbyt dużej przestrzeni dyskowej. Dlaczego Oracle nie przepisuje zapytania ponownie? Co mogę zrobić, aby to naprawić?
Świetne wyjaśnienie! Dzięki za poświęcenie czasu. Niefortunne dla mnie, że pracuję z SAP BusinessObjects, więc miałem nadzieję, że skorzystam z zapytania nie zagnieżdżonego. Zaznaczę to jako akceptowaną odpowiedź, aby wyjaśnić to tak dobrze i szybko. –