Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 fast refresh для join view в хранилище  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Народ, решил перевести complete refresh матвьюху с atomic refresh на fast refresh, ибо как мне казалось она медленно обновляется (5 таблиц в джоине, в итоге 23 миллиона записей) - 18 минут. сделал fast refresh и когда в исходных данных по матлогам поменялось около 8 тысяч записей (примерно треть от обычного дневного изменения) запустил рефрэш. результат таков - за час результата не дождался. вначале делался delete минут 5, потом update минут 10, потом пошёл ацкий инсерт (текст запроса просто адский - куча хитнтов, джоинов, план убийственный - куча фулсканов и т.д.). в параллель идёт 48 процессов, поэтому как быстрее сделать неясно. никто с таким не сталкивался? как боротьтся или на всё плюнуть и оставить как есть?
8 авг 13, 18:01    [14683091]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Rb-Sr
Member

Откуда:
Сообщений: 296
Shtock,
Надо мерить все возможные варианты, учитывая требования к доступности данных и т.п.

У меня самый быстрый результат в варианте truncate, т.е. complite + atomic_refresh в FALSE, минимум UNDO и REDO
8 авг 13, 18:33    [14683187]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Shtock
сделал fast refresh


А Вы уверены, что у Вас выполняется именно FAST REFRESH ?
8 авг 13, 18:58    [14683253]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
К сожалению уверен, что именно fas. Видно, что вначале идёт характерный делит хитроопый, потом апдейты и инсерты и все они обращаются к матлогам. Одним из условий fast refresh вьюх является наличие rowid по всем полям, я на всякий даже по ним индексы сделал, но не помогает. делит 5 минут работает, инсерты после 3000 секунд ожидания я отключил...

to tb-sr: с complete понятно, он 18 минут идёт, но я то хотел быстрее. Более того, чтобы ускорить скорость у меня ещё матвьюхи nologging, поэтому redo меньше чем у вас потребляется :).
8 авг 13, 23:53    [14684397]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Много сумбура.

Во-первых, rowid "по всем полям" (по таблицам, вы, наверное, имели в виду) - это требование к fast refreshable matview для joins. Если matview состоит только из группировки и аггрегатов по одной таблице - это необязательно.
Во-вторых,
автор
решил перевести complete refresh матвьюху с atomic refresh на fast refresh
- это как бы... теплое с мягким. На одном уровне с понятием fast refresh стоит complete refresh, а atomic refresh = true|false.
В-третьих, по вашему ответу так и не понятно, как вы убедились, что идет fast refresh.
Вам в помощь DBMS_MVIEW.explain (чего-то там). Вот там будет четко видно, что она может, а что нет. Сюда же еще
SELECT fast_refreshable, last_refresh FROM user_mviews WHERE ...
.
9 авг 13, 01:46    [14684497]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
В зависимости от некоторых условий fast refresh может срабатывать только для inserts, а для updates и deletes - не будет.
Поэтому "наличие обращений к matview logs" - не самый очевидный способ анализа.
9 авг 13, 01:48    [14684500]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Вадиман
В зависимости от некоторых условий fast refresh может срабатывать только для inserts, а для updates и deletes - не будет.


Наверное, Вы даже и реальный сценарий можете воспроизвести и нам показать ?
9 авг 13, 08:16    [14684694]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Гламурный черт
Вадиман
В зависимости от некоторых условий fast refresh может срабатывать только для inserts, а для updates и deletes - не будет.


Наверное, Вы даже и реальный сценарий можете воспроизвести и нам показать ?

пожалуйста

SQL> create table x (id int, n int);

Table created.

SQL> insert into x (id, n)
  2  select 1, 2
  3  from   dual
  4  union all
  5  select 1, 3
  6  from   dual
  7  union all
  8  select 2, 4
  9  from  dual;

3 rows created.

SQL> commit;

Commit complete.

SQL> create materialized view log on x with rowid, sequence (id, n) including new values;

Snapshot log created.

SQL> create materialized view x_mview
  2  refresh fast on demand as
  3  select id, sum(n) as amount
  4  from   x
  5  group by id;
  
Snapshot created.

SQL> select fast_refreshable, last_refresh_type from user_mviews where mview_name = 'X_MVIEW';

FAST_REFRESHABLE   LAST_REF                                                                         
------------------ --------                                                                         
DIRLOAD_LIMITEDDML COMPLETE                                                                         

SQL> insert into x(id, n) values (1, 5);

1 row created.

SQL> commit;

Commit complete.

SQL> EXEC dbms_mview.refresh('x_mview', 'F');

PL/SQL procedure successfully completed.

SQL> select last_refresh_type from user_mviews where mview_name = 'X_MVIEW';

LAST_REF                                                                                            
--------                                                                                            
FAST                                                                                                

SQL> update x set n = 8 where id = 2;

1 row updated.

SQL> commit;

Commit complete.

SQL> exec dbms_mview.refresh('x_mview', 'F');
BEGIN dbms_mview.refresh('x_mview', 'F'); END;

*
ERROR at line 1:
ORA-32314: REFRESH FAST of "VB5"."X_MVIEW" unsupported after deletes/updates 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2254 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2460 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2429 
ORA-06512: at line 1 


SQL> spool off
9 авг 13, 08:58    [14684812]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Вадиман
пожалуйста


Вы, вероятно, меня не поняли (или я недостаточно точно сформулировал).
Вы привели классический сценарий insert-only MV.

У автора, насколько можно судить, обновление выполняется без ошибок.
И я сомневаюсь, что он использует управление параметром типа обновления.
Кроме того, я имел в виду что Oracle не может отдельно выполнять fast refresh для операций insert и complete - для update. :)

SQL> exec dbms_mview.refresh('x_mview', 'F');
BEGIN dbms_mview.refresh('x_mview', 'F'); END;

*
ERROR at line 1:
ORA-32314: REFRESH FAST of "SCOTT"."X_MVIEW" unsupported after deletes/updates 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2558 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2771 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2740 
ORA-06512: at line 1 


SQL> exec dbms_mview.refresh('x_mview');
BEGIN dbms_mview.refresh('x_mview'); END;

*
ERROR at line 1:
ORA-32314: REFRESH FAST of "SCOTT"."X_MVIEW" unsupported after deletes/updates 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2558 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2771 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2740 
ORA-06512: at line 1 


SQL> exec dbms_mview.refresh('x_mview','C');

PL/SQL procedure successfully completed.

SQL> insert into x(id, n) values (1, 5);

1 row created.

SQL> update x set n = 8 where id = 2;

1 row updated.

SQL> commit;

Commit complete.

SQL> exec dbms_mview.refresh('x_mview');
BEGIN dbms_mview.refresh('x_mview'); END;

*
ERROR at line 1:
ORA-32314: REFRESH FAST of "SCOTT"."X_MVIEW" unsupported after deletes/updates 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2558 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2771 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2740 
ORA-06512: at line 1 
9 авг 13, 11:09    [14685670]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
To Вадиман: если Вы читаете внимательно, у меня как раз вью с джоином. по моему ответу очень понятно, как я убедился, что идёт фаст-рефрэш. Как Вы думаете, если вместо truncate и insert идет вначале delete, потом update, потом insert и там участвуют таблицы матлогов (о чём я писал ранее), значит ли это, что идёт фаст рефреш. Я отвечу вам - да. Более того, вьюха бы тупо не создалась. Не правда ли

to Гламурный чёрт: для обновления всех матвьюх в хранилище (не все из которых fast), я использую одну процедуру, в которой вызываю refresh, поэтому тип обновления использую '?'


В общем пока моё мнение таково - имеющаяся реализация fast refresh не годится для Join вьюх с каким-либо серьёзным объемом данных.
9 авг 13, 12:31    [14686270]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
На малом объеме записей я проверял (делал ручные update) - при update прекрасно без ошибок всё отрабатывает.
9 авг 13, 12:35    [14686300]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Shtock
В общем пока моё мнение таково - имеющаяся реализация fast refresh не годится для Join вьюх с каким-либо серьёзным объемом данных.


А Вы вообще меряли события ожидания для вашего процесса ? Трассировку 10046 снимали ?
Я много лет уже слышу "Oracle налажал", "Oracle не годится", но в 95 % случаев это недопонимание
сути явления и механизмов. Есть конечно и оставшиеся 5% - как предмет рассмотрения в металинке.
9 авг 13, 12:36    [14686308]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Пока ещё нет, ибо пытаюсь узнать имел ли кто такие проблемы, но зато я знаю что без fast оно работало (и сейчас работает) 18 минут, а с типа как-бы быстрым дождаться результата я не смог...
9 авг 13, 12:46    [14686379]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Shtock
Пока ещё нет, ибо пытаюсь узнать имел ли кто такие проблемы, но зато я знаю что без fast оно работало (и сейчас работает) 18 минут, а с типа как-бы быстрым дождаться результата я не смог...


Попробуйте снять трассе 10046 на небольших объемах и посмотрите, какие запросы использует процесс для формирования
данных.
9 авг 13, 14:20    [14687112]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Shtock
по моему ответу очень понятно, как я убедился, что идёт фаст-рефрэш


Вам бы на самом деле надо вот это проверить - опять-таки на далых объемах.

select fast_refreshable, last_refresh_type from user_mviews where mview_name = '...';
9 авг 13, 14:36    [14687251]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Гламурный черт
Вы, вероятно, меня не поняли (или я недостаточно точно сформулировал).
Вы привели классический сценарий insert-only MV.

У автора, насколько можно судить, обновление выполняется без ошибок.
И я сомневаюсь, что он использует управление параметром типа обновления.
Кроме того, я имел в виду что Oracle не может отдельно выполнять fast refresh для операций insert и complete - для update. :)

В моем примере поменяйте
DBMS_MVIEW.refresh('x_mview', 'F');
на
DBMS_MVIEW.refresh('x_mview', '?'); 
. Получится у вас и без ошибок, и fast refresh для insert + complete для update.
12 авг 13, 01:31    [14694470]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Вадиман
Получится у вас и без ошибок


Спасибо, Кэп.

Вадиман
fast refresh для insert + complete для update.


Даже не смешно.

SQL> insert into x(id, n) values (1, 5);

1 row created.

SQL> update x set n = 8 where id = 2;

1 row updated.

SQL> exec dbms_mview.refresh('x_mview','?')

PL/SQL procedure successfully completed.

SQL> select last_refresh_type from user_mviews where mview_name = 'X_MVIEW';

LAST_REF                                                                        
--------                                                                        
COMPLETE                                                                        



Часть трассы 10046, единственные операции над MV:

...
delete from "SCOTT"."X_MVIEW"
...
INSERT /*+ BYPASS_RECURSIVE_CHECK */ INTO "SCOTT"."X_MVIEW"("ID","AMOUNT",
  "CNT","CID") SELECT "X"."ID",SUM("X"."N"),COUNT(*),COUNT("X"."ID") FROM "X" 
  "X" GROUP BY "X"."ID"
12 авг 13, 12:09    [14695696]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Гламурный черт
Вадиман
Получится у вас и без ошибок


Спасибо, Кэп.

Вадиман
fast refresh для insert + complete для update.


Даже не смешно.

SQL> insert into x(id, n) values (1, 5);

1 row created.

SQL> update x set n = 8 where id = 2;

1 row updated.

SQL> exec dbms_mview.refresh('x_mview','?')

PL/SQL procedure successfully completed.

SQL> select last_refresh_type from user_mviews where mview_name = 'X_MVIEW';

LAST_REF                                                                        
--------                                                                        
COMPLETE                                                                        



Часть трассы 10046, единственные операции над MV:

...
delete from "SCOTT"."X_MVIEW"
...
INSERT /*+ BYPASS_RECURSIVE_CHECK */ INTO "SCOTT"."X_MVIEW"("ID","AMOUNT",
  "CNT","CID") SELECT "X"."ID",SUM("X"."N"),COUNT(*),COUNT("X"."ID") FROM "X" 
  "X" GROUP BY "X"."ID"


Естественно.
А теперь в отдельных транзакциях попробуйте.
Такое ощущение, что я уговариваю :)
Подумайте немного сами.
13 авг 13, 01:39    [14699608]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
Вадиман
А теперь в отдельных транзакциях попробуйте.
Такое ощущение, что я уговариваю :)
Подумайте немного сами.


Я не девушка, чтобы меня уговаривать. Исходный пост автора перечитайте,
и подумайте тоже, какое отношение Ваш пример имеет к его случаю.
То что refresh изменений, содержащих ТОЛЬКО insert пройдет с fast,
то с этим никто не спорил и не спорит.
У автора же мешанина операций.
13 авг 13, 08:25    [14699819]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Гламурный черт
Вадиман
А теперь в отдельных транзакциях попробуйте.
Такое ощущение, что я уговариваю :)
Подумайте немного сами.


Я не девушка, чтобы меня уговаривать. Исходный пост автора перечитайте,
и подумайте тоже, какое отношение Ваш пример имеет к его случаю.
То что refresh изменений, содержащих ТОЛЬКО insert пройдет с fast,
то с этим никто не спорил и не спорит.
У автора же мешанина операций.


Ну то есть, с этим вопросом мы разобрались, верно?
Гламурный черт
Вадиман
В зависимости от некоторых условий fast refresh может срабатывать только для inserts, а для updates и deletes - не будет.


Наверное, Вы даже и реальный сценарий можете воспроизвести и нам показать ?

Сценарий воспроизведен и показан.
Вы задали этот вопрос, не озаботившись "мешаниной из операций" у автора.

Кстати, из первого сообщения не ясно, что там мешанина из операций.
13 авг 13, 08:39    [14699850]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
Гламурный черт
Member

Откуда:
Сообщений: 181
[quot Вадиман]Вы задали этот вопрос, не озаботившись "мешаниной из операций" у автора.
[/qout]

Равным образом как и Вы начали отвечать.

Вадиман
Кстати, из первого сообщения не ясно, что там мешанина из операций.


Ну конечно, конечно....

автор
вначале делался delete минут 5, потом update минут 10, потом пошёл ацкий инсерт
13 авг 13, 08:45    [14699863]     Ответить | Цитировать Сообщить модератору
 Re: fast refresh для join view в хранилище  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Земляк подобную тему создавал, правда, REFRESH ON COMMIT: https://www.sql.ru/forum/859157/medlennyy-fast-refresh-matvu Там же есть ссылка на другую. Теоретически, кто-то сталкивался, но без примера с операторами и планами тяжело гадать.
13 авг 13, 17:50    [14703979]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить