Не удается установить атрибут обновления ON COMMIT при создании материализованного представления, содержащего частичный первичный ключ в Oracle
Мне нужно извлечь уникальные значения столбца, который является частью первичного ключа из таблицы в материализованное представление. Я могу создать материализованное представление, если использовать "обновление завершено", но безуспешно при попытке использовать "быстрое обновление при фиксации". Может кто-нибудь указать, пропустил ли я что-нибудь или Oracle не поддерживает такие действия.
Пример вывода приведен ниже. Благодарю.
SQL> create table TEST( col1 number, col2 number, col3 varchar(32), CONSTRAINT test_pk Primary Key (col1, col2));
Table created.
SQL> create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test;
create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test
*
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
SQL> create materialized view test_mv build immediate refresh complete as select distinct col2 from test;
Materialized view created.
SQL> drop materialized view test_mv;
Materialized view dropped.
SQL> create materialized view log on test;
Materialized view log created.
SQL> create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test;
create materialized view test_mv build immediate refresh fast on commit as select distinct col2 from test
*
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
2 ответа
Основным вопросом, на ваш взгляд, является предложение DISTINCT. Быстрое обновление при фиксации очень чувствительно к базовому запросу. Существует много правил, которые должны быть выполнены для материализованного представления для поддержки быстрого обновления. DISTINCT предотвращает это.
Вы можете проверить возможности материализованного представления, используя DBMS_MVIEW.EXPLAIN_MVIEW
процедура:
DECLARE
result SYS.EXPLAINMVARRAYTYPE := SYS.EXPLAINMVARRAYTYPE();
BEGIN
DBMS_MVIEW.EXPLAIN_MVIEW('TEST_MV', result);
FOR i IN result.FIRST..result.LAST LOOP
DBMS_OUTPUT.PUT_LINE(result(i).CAPABILITY_NAME || ': ' || CASE WHEN result(i).POSSIBLE = 'T' THEN 'Yes' ELSE 'No' || CASE WHEN result(i).RELATED_TEXT IS NOT NULL THEN ' because of ' || result(i).RELATED_TEXT END || '; ' || result(i).MSGTXT END);
END LOOP;
END;
Вы найдете больше информации в документации http://docs.oracle.com/cd/B28359_01/server.111/b28313/basicmv.htm
Быстрое обновление просмотров придирчиво. Это решение требует материализованного журнала представлений с определенными свойствами и материализованного представления с несколькими дополнительными функциями и другим синтаксисом.
DISTINCT
само по себе не поддерживается. Но есть совокупные материализованные взгляды, которые поддерживают GROUP BY
, Если этот материализованный вид создается с ENABLE QUERY REWRITE
Oracle может использовать его в DISTINCT
запрос. Существует также дополнительная COUNT(*)
потому что "COUNT(*) всегда должен присутствовать, чтобы гарантировать все типы быстрого обновления".
Создать таблицу, журнал материализованного представления и материализованное представление.
create table test(col1 number, col2 number, col3 varchar(32)
,constraint test_pk primary key (col1, col2));
create materialized view log on test with rowid (col2) including new values;
create materialized view test_mv
build immediate
refresh fast on commit
enable query rewrite as
select col2, count(*) total from test group by col2;
Запросы могут использовать материализованное представление.
Эти планы объяснения показывают, что материализованное представление работает как для GROUP BY
и DISTINCT
запрос.
explain plan for select col2 from test group by col2;
select * from table(dbms_xplan.display);
explain plan for select distinct col2 from test;
select * from table(dbms_xplan.display);
Plan hash value: 1627509066
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| TEST_MV | 1 | 13 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------