Перезапись запроса 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
теперь я хочу переписать запрос, чтобы запустить следующий запрос:
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
Backstory: я делаю это с 70M строками и 50 виртуальными столбцами (все они имеют одинаковую структуру, простой случай оператор выше, но с другим столбцом сравнения и другим столбцом результата)
эта проблема, кажется, проявляется только тогда, когда таблица фактов имеет виртуальные столбцы, но изменение их на не-виртуальные потребляет слишком много дискового пространства. Почему Oracle не переписывает запрос? Что я могу сделать, чтобы исправить это?
1 ответов
Я не знаю, насколько это полезно для вас, но Oracle требует, чтобы все столбцы, на которые группируется materialzied view, были включены в инструкцию для перезаписи. (редактировать по крайней мере в сочетании с виртуальными столбцами. Это, вероятно, "не по дизайну"...)
если вы попытаетесь explain_rewrite
on
select
demo_dim_one,
sum(s)
from (
select
demo_dim_one,
sum(demo_measure_from_virtual) s
from
demo_fact
group by
demo_dim_one,
demo_dim_two
)
group by demo_dim_one
он должен сказать вам, что он переписал запрос.
это можно продемонстрировать так:
таблица к которой виртуальный столбец будет определен:
create table tq84_virt_col (
a varchar2(2),
b varchar2(2),
c number,
d number
);
insert into tq84_virt_col values ('A', 'X', 1, 1);
insert into tq84_virt_col values ('A', 'X', 2, 1);
insert into tq84_virt_col values ('A', 'Y', 3, 0);
insert into tq84_virt_col values ('A', 'Y', 4, 1);
insert into tq84_virt_col values ('B', 'Y', 11, 1);
insert into tq84_virt_col values ('B', 'X', 12, 0);
insert into tq84_virt_col values ('B', 'X', 13, 1);
определение виртуального столбца:
alter table tq84_virt_col add (
virt_col number generated always as (
case when d = 1 then c else 0 end
)
virtual visible
);
материализованное представление. Примечание: он группируется по столбцам a
и b
:
create materialized view tq84_mat_view
refresh force on demand
enable query rewrite
as
select
a, b,
sum(virt_col) sum_virt_col
from
tq84_virt_col
group by
a,b
материализованный вид не будет использоваться, как вы заметили:
begin
dbms_mview.explain_rewrite(
'select a, sum(virt_col) from tq84_virt_col group by a'
);
end;
/
select message
from rewrite_table;
QSM-01150: query did not rewrite
QSM-01102: materialized view, TQ84_MAT_VIEW, requires join back to table, TQ84_VIRT_COL, on column, VIRT_COL
QSM-01082: Joining materialized view, TQ84_MAT_VIEW, with table, TQ84_VIRT_COL, not possible
QSM-01102: materialized view, TQ84_MAT_VIEW, requires join back to table, TQ84_VIRT_COL, on column, C
теперь обе колонки a
и b
выбираются и группируются по (с внешним запросом, чтобы обеспечить тот же набор результатов):
truncate table rewrite_table;
begin
dbms_mview.explain_rewrite(
'select a, sum(s) from (select a, sum(virt_col) s from tq84_virt_col group by a, b) group by a'
);
end;
/
select message
from rewrite_table;
QSM-01151: query was rewritten
QSM-01209: query rewritten with materialized view, TQ84_MAT_VIEW, using text match algorithm
QSM-01219: no suitable materialized view found to rewrite this query