powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем может быть причина замедления FORALL INSERT?
66 сообщений из 66, показаны все 3 страниц
В чем может быть причина замедления FORALL INSERT?
    #39836040
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В чем может быть причина замедления FORALL INSERT?

Несколько разных сессий выполняют вот такую процедуру вставки строк. Процедура приведена не полностью, но замеры времени выполнения участков кода, показывают что именно время выполнение этого кода возрастает.

Здесь выполняется INSERT через FORALL порциями по 10000 строк. Таблица, в которую выполняется вставка, совершенно пустая – вновь созданная, нет никаких триггеров, никаких индексов , но она LOGGING. Чем дальше, тем больше становиться время вставки порции строк. Т.е. скорость процесса всё время плавно уменьшается.

Хинт APPEND здесь не работает (это подтверждается планом в котором говориться что conventional insert (не direct)). Пробовал заменить на APPEND_VALUES – в этом случае сессии начинают блокировать друг друга, появляется ожидание «enq: TM – contention» и всё тормозит еще сильнее.

Ожидания этой сессии, отсортировано по TIME_WAITED, ничего криминального тут не вижу.
EVENT;TIME_WAITEDdirect path read;262343db file sequential read;9715read by other session;6161db file parallel read;736direct path read temp;426Disk file operations I/O;218direct path write temp;81direct path write;46latch: cache buffers chains;9library cache load lock;7log file switch (private strand flush incomplete);3cursor: pin S wait on X;2library cache: mutex X;1events in waitclass Other;1latch: shared pool;0latch: row cache objects;0enq: HW - contention;0buffer busy waits;0

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN
   OPEN l_cursor FOR
      SELECT *
        FROM ela_document
       WHERE id BETWEEN X1 AND X2;

   LOOP
      BEGIN
         FETCH l_cursor BULK COLLECT INTO l_data LIMIT 10000;

         FORALL i IN 1 .. l_data.COUNT
            INSERT /*+ APPEND */
                  INTO  ela_document_copy
                 VALUES l_data (i);

         COMMIT;
      END;

      EXIT WHEN l_cursor%NOTFOUND;
   END LOOP;
END;
/



В чём может быть причина постепенного замедления процесса? И как это исправить?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836064
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobИ как это исправить?
зачем?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836068
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lsMinistrBobИ как это исправить?
зачем?

Чтобы быстрее вставлялось или хотя бы скорость не уменьшалась а оставалась на одном уровне.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836077
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobИ как это исправить?Не гонять через PL/SQL.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836091
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobЗдесь выполняется INSERT через FORALL порциями по 10000 строк. Таблица, в которую выполняется вставка, совершенно пустая – вновь созданная, нет никаких триггеров, никаких индексов , но она LOGGING. Чем дальше, тем больше становиться время вставки порции строк. Т.е. скорость процесса всё время плавно уменьшается.

Хинт APPEND здесь не работает (это подтверждается планом в котором говориться что conventional insert (не direct)). Пробовал заменить на APPEND_VALUES – в этом случае сессии начинают блокировать друг друга, появляется ожидание «enq: TM – contention» и всё тормозит еще сильнее.


1. Хинт append и не должен работать в insert values.
2. append_values - правильная замена append для insert values
3. insert append блокирует сегмент, в который выполняет вставку - это штатное поведение, и именно поэтому в конкурентном окружении вставку append-ом обычно не производят.

По деградации производительности: в Вашем случае, скорее всего, дело в запросе, которым гребет данные курсор.
Если он гребет данные из интенсивно обновляемой таблицы - то сценарий весьма вероятен.
Я бы снял 10046 level8 с процесса и локализовал проблему, но апологеты ash/awr, боюсь, сейчас забросают меня помидорами :)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836145
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobЧтобы быстрее вставлялось или хотя бы скорость не уменьшалась а оставалась на одном уровне.
так скорость значительно падает? или Вы пишите из-за 1-2%?
вставьте одним insert select, без разбиения на мелкие порции
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836406
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lsMinistrBobЧтобы быстрее вставлялось или хотя бы скорость не уменьшалась а оставалась на одном уровне.
так скорость значительно падает? или Вы пишите из-за 1-2%?
вставьте одним insert select, без разбиения на мелкие порции
ElicНе гонять через PL/SQL.

Смысл в PL\SQL и разбиении на маленькие порции в задаче.
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022 и больше его расширять не получиться.
На оборудовании заказчика такая операция оценочно идет 20-30 дней.
Поэтому нужен процесс переноса, который можно перезапускать многократно.
Пробовали alter table ... move и dbms_redefinition - не подходит в данном случае. Если эти процессы падают, а они падают это время и не один раз, а еще иногда просят остановить всё потому что тормозит всё сильно. Поэтому нужен полностью управляемый код, который можно править как хочешь.

andrey_anonymousПо деградации производительности: в Вашем случае, скорее всего, дело в запросе, которым гребет данные курсор.
Если он гребет данные из интенсивно обновляемой таблицы - то сценарий весьма вероятен.
Я бы снял 10046 level8 с процесса и локализовал проблему, но апологеты ash/awr, боюсь, сейчас забросают меня помидорами :)

По поводу трассировки хорошая идея, только заказчик не даёт доступ к серверу непосредственно, у меня есть только машина с Toad и учёткой пользователя sysdba, а вот sys у меня нет. Из Toad можно конечно запустить трассировку, но как потом получить файл, а самое главное его обработать, чего-то не хочеться в сыром трейсе копаться.

Запрос гребет из опорной таблицы в которой просто список ID переносимых строк, чтобы понимать что уже перенесено. После вставки порции 10000 этаже порция ID удаляется из этой таблицы, т.е. да она постоянно обновляется, насчёт интенсивно или нет - не знаю. А что тут можно сделать?

Последний замер показал что скорость не уменьшается линейно, она постоянно разная, просто она стала меньше чем в первый день в целом, поэтому показалось что она уменьшается. Во вложении график скорости процесса за вчера - пик был в 6 утра, спрошу у админа чего у них там такое происходит в это время.

Приведу ниже всю процедуру чтобы было понятно. Таких процедур выполняется 10 шт, т.е. 10 потоков, и в каждом потоке еще и вставка идет порциями по 10000 строк. Такая порция, при работающих пользователях, сейчас вставляется примерно за 30 минут.

ИЗ ИДЕЙ:
- Хочу попробовать одну процедуру (один поток) с +APPEND_VALUES и порциями побольше, 50-100тыс.строк.

Вот текст типовой процедуры (одна из 10).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
declare
   TYPE ARRAY IS TABLE OF ela_document%ROWTYPE;

   l_data         ARRAY;
   l_cnt          NUMBER := 0;
   l_obj          BINARY_INTEGER;
   l_log_rindex   BINARY_INTEGER;
   l_log_slno     BINARY_INTEGER;
   l_log_total    NUMBER;
   l_chunk_name   VARCHAR2 (255);
   l_cursor       SYS_REFCURSOR;
   t               NUMBER;
BEGIN
insert into ora_move (text,cdate) values ('START PROG_MOVE_TABLE_10', sysdate);


   OPEN l_cursor FOR
      select d.* from ela_document d 
      where d.elado_document_id in (select id from ela_doc_chunks where chunk# = 10);

commit;

   l_log_total := 7098807;
   l_chunk_name := 'PROG_MOVE_TABLE_10';

   SELECT o.object_id
     INTO l_obj
     FROM user_objects o
    WHERE o.object_type = 'TABLE' AND o.object_name = 'ELA_DOCUMENT';

   DBMS_APPLICATION_INFO.set_client_info ('Move_Table_Chunk');
   l_log_rindex := DBMS_APPLICATION_INFO.set_session_longops_nohint;

   DBMS_APPLICATION_INFO.set_session_longops (l_log_rindex, -- ид. строки в v$session_longops
                                              l_log_slno, -- зарезервировано Oracle
                                              l_chunk_name, -- имя длительной операции
                                              l_obj, -- ид. обрабатываемого объекта
                                              0, -- произвольное число, которое мы хотим публиковать
                                              0,        -- сколько уже сделано
                                              l_log_total, -- сколько всего нужно сделать
                                              'row',    -- одна единица работы
                                              'rows'); -- единицы работы (мн. число)

   LOOP
   BEGIN
   --t := DBMS_UTILITY.get_time;
      FETCH l_cursor BULK COLLECT INTO l_data LIMIT 10000;
   --insert into ora_move (text,cdate, description) values ('FETCH PROG_MOVE_TABLE_10', sysdate, (DBMS_UTILITY.get_time - t)/100);                             
      
      t := DBMS_UTILITY.get_time;
      FORALL i IN 1 .. l_data.COUNT
         INSERT /*+ APPEND */
               INTO  ela_document_copy
              VALUES l_data (i);
      insert into ora_move (text,cdate, description) values ('insert10->'||l_cnt, sysdate, (DBMS_UTILITY.get_time - t)/100);
      
      --t := DBMS_UTILITY.get_time;        
      FORALL i IN 1..l_data.COUNT
         DELETE FROM ela_doc_chunks WHERE ID = l_data(i).elado_document_id;
      --insert into ora_move (text,cdate, description) values ('delete10->'||l_cnt, sysdate, (DBMS_UTILITY.get_time - t)/100);

commit;

      l_cnt := l_cnt + 10000;
      DBMS_APPLICATION_INFO.set_session_longops (l_log_rindex,
                                                 l_log_slno,
                                                 l_chunk_name,
                                                 l_obj,
                                                 0,
                                                 l_cnt,
                                                 l_log_total,
                                                 'row',
                                                 'rows');
   
    exception when others then
    insert into ora_move (text,cdate, description) values (DBMS_UTILITY.format_error_stack, sysdate, l_chunk_name||': '||l_cnt||' из '||l_log_total);
commit;
   END;                                              
      EXIT WHEN l_cursor%NOTFOUND;
   END LOOP;
commit;
   CLOSE l_cursor;
   insert into ora_move (text,cdate) values ('STOP PROG_MOVE_TABLE_10', sysdate);
   END;
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836424
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob есть только машина с Toad и учёткой пользователя sysdba, а вот sys у меня нет.
ты отжигаешь
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836508
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobПоследний замер показал что скорость не уменьшается линейно, она постоянно разная, просто она стала меньше чем в первый день в целом, поэтому показалось что она уменьшается. Во вложении график скорости процесса за вчера - пик был в 6 утра, спрошу у админа чего у них там такое происходит в это время.
наверное это пик загрузки системы, например дисковой системы, у Вас же другие сессия базе работают?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836572
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-MinistrBob есть только машина с Toad и учёткой пользователя sysdba, а вот sys у меня нет.
ты отжигаешь

Поверь, это не самое извращенное что мне приходилось делать :) А что делать то. Не мы таки, жизнь така.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836574
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lsMinistrBobПоследний замер показал что скорость не уменьшается линейно, она постоянно разная, просто она стала меньше чем в первый день в целом, поэтому показалось что она уменьшается. Во вложении график скорости процесса за вчера - пик был в 6 утра, спрошу у админа чего у них там такое происходит в это время.
наверное это пик загрузки системы, например дисковой системы, у Вас же другие сессия базе работают?

Конечно работают. Там порядка 1200 пользовательских сессий и еще куча служб всяких. Я же и говорю процесс дней на 20-30 при полной загрузке, в этом то и прелесть :)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836623
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobКонечно работают. Там порядка 1200 пользовательских сессий и еще куча служб всяких. Я же
и говорю процесс дней на 20-30 при полной загрузке, в этом то и прелесть :)
так пусть "хозяева" снимут Вам AWR
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836640
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobтолько заказчик не даёт доступ к серверуТы кто там? Разработчик? Временной консультант? ...?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836704
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicMinistrBobтолько заказчик не даёт доступ к серверуТы кто там? Разработчик? Временной консультант? ...?

Я бы это назвал временная и экстренная тех.поддержка. "Пока гром не грянет, мужик живёт и думает что всё ОК". Но на самом деле когда система вводилась в эксплуатацию лет 7 назад, никто и не предполагал что таблицы будут разрастаться до таких размеров, и ведь ничего оттуда удалять нельзя - все нужное.
Весь мир катиться к тому что скоро многие технологии перестанут работать, тупо из-за объемов данных, вот здесь простой move table уже не катит. Вот интересная статья на тему - Почему RAID 6 перестанет работать в 2019 году?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39836840
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobА что делать тоНевежество вздохами не лечится.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837035
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob....
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022
....

MinistrBob....
Но на самом деле когда система вводилась в эксплуатацию лет 7 назад, никто и не предполагал что таблицы будут разрастаться до таких размеров, и ведь ничего оттуда удалять нельзя - все нужное.
....

мало кто знает, что будет с ним через 7 лет, не говоря уже о самой идеальной системе, созданной здесь и сейчас.
Вам(Тебе) нужно не xyйнёй "экстренная тех.поддержка" заниматься, а рефакторить архитектуру, разбив эту неебическую таблицу на множества: партиции, но тут, боюсь, даже они уже не вытянут, а лучше разные таблицы по периодам (кстати до появления партиций вполне себе работающий и, кстати, до сих пор на некоторых системах древней разработки, метод).
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837094
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobandrey_anonymousПо деградации производительности: в Вашем случае, скорее всего, дело в запросе, которым гребет данные курсор.
Если он гребет данные из интенсивно обновляемой таблицы - то сценарий весьма вероятен.
Я бы снял 10046 level8 с процесса и локализовал проблему, но апологеты ash/awr, боюсь, сейчас забросают меня помидорами :)
По поводу трассировки хорошая идея, только заказчик не даёт доступ к серверу непосредственно, у меня есть только машина с Toad и учёткой пользователя sysdba, а вот sys у меня нет.
Из Toad можно конечно запустить трассировку, но как потом получить файл, а самое главное его обработать, чего-то не хочеться в сыром трейсе копаться.
Этого более чем достаточно.

Код: plsql
1.
2.
3.
4.
select value from v$system_parameter where name like 'user_dump_dest';
create directory user_dump_dest as '<результат предыдущего запроса>';
select tracefile from v$process where addr in (select paddr from v$session where sid=<трассируемая сессия>);
select bfilename('user_dump_dest','<имя файла>') from dual;



Обработать - можно хоть штатным tkprof, хоть orasrp.

MinistrBob
Запрос гребет из опорной таблицы в которой просто список ID переносимых строк, чтобы понимать что уже перенесено.


После вставки порции 10000 этаже порция ID удаляется из этой таблицы, т.е. да она постоянно обновляется, насчёт интенсивно или нет - не знаю. А что тут можно сделать?
Напрасно.
Просто логируйте максимальный перенесенный вашей же процедурой ID в отдельную табличку и отбирайте по критерию неравенства.

MinistrBobВот текст типовой процедуры (одна из 10).

Избавьтесь от delete, он не нужен.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837113
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousмаксимальный перенесенный вашей же процедурой IDОдного id мало для попроцессного распараллеливания.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837128
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Я бы на месте автора сделал бы немного по другому.
Создал бы таблицу, содержащую инфу для параллельной обработки, в которой бы хранил диапазоны ID, которые необходимо перенести в рамках одной таски
Код: plsql
1.
2.
3.
4.
create table ela_doc_chunks  as
select min(id) start_id,max(id) end_id,count(1) cnt, chunk#, 'I' status from
(select ntile(50) over (order by id ) chunk#,id from ela_document)
group by chunk# order by chunk#


Процедурой брал бы первый необработанный кусок, сразу проставлял ему статус ЗАНЯТО, дабы параллельные процессы не забрали его вместе с текущим
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
cursor crTas is select * from ela_doc_chunks where STATUS= 'I' order by chunk# for update;
rTas crTas%rowtype;
begin
  
open crTas;
fetch crTas into rTas;
if crTas%NOTFOUND then
  close crTas;
  rollback;
  return;
end if;
update ela_doc_chunks  set STATUS= 'P' where current of crTas;
close crTas;
commit;
  ...обработка
end;


обрабатывал его без всяких массивов просто
Код: plsql
1.
insert into ela_document_copy select * from ela_document where id between rTas.start_id and rTas.end_id


в конце проставлял, что кусок завершен.
Код: plsql
1.
update ela_doc_chunks  set STATUS= 'C' where chunk# = rTas.chunk#;



как вариант почитайте еще про DBMS_PARALLEL_EXECUTE
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837134
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плюс нужно понимать, что параллельные insertы не всегда работают лучше одиночного, так как работа в таком режиме идёт в основном с дисками, а не с CPU(10046 level 8 покажет какие ожидания доминируют, как уже сказали выше)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837178
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobСмысл в PL\SQL и разбиении на маленькие порции в задаче.
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022 и больше его расширять не получиться.
На оборудовании заказчика такая операция оценочно идет 20-30 дней.
Поэтому нужен процесс переноса, который можно перезапускать многократно.
Пробовали alter table ... move и dbms_redefinition - не подходит в данном случае. Если эти процессы падают, а они падают это время и не один раз, а еще иногда просят остановить всё потому что тормозит всё сильно. Поэтому нужен полностью управляемый код, который можно править как хочешь.
виртуально делите исходную таблицу на N сопоставимого размера кусков, через dbms_parallel_execute.create_chunks_by_rowid/create_chunks_by_number_col, либо DIY parallelism .

куски грузим последовательно, в один поток, но с enable_parallel_dml и выставленным DOP. примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
begin 
for c in (select start_rowid, end_rowid from DBA_PARALLEL_EXECUTE_CHUNKS ) loop
insert /*+append parallel(32) no_gather_optimizer_statistics*/ into target select * from source where rowid between c.start_rowid and c.end_rowid;
commit;
end loop;
end;


конкретные N и DOP подбирать по ситуации и тестировать. чем меньше N, тем меньше времени займет процесс от начала до конца, но тем выше будет цена падения процесса загрузки одного куска.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837366
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBobТаких процедур выполняется 10 шт, т.е. 10 потоков, и в каждом потоке еще и вставка идет порциями по 10000 строк.

Интересно, как у вас работает параллельная вставка из нескольких потоков в одну и ту же таблицу с хинтом APPEND?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837372
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
watsonMinistrBobТаких процедур выполняется 10 шт, т.е. 10 потоков, и в каждом потоке еще и вставка идет порциями по 10000 строк.

Интересно, как у вас работает параллельная вставка из нескольких потоков в одну и ту же таблицу с хинтом APPEND?Перечитай его сообщения.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837379
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-watsonпропущено...


Интересно, как у вас работает параллельная вставка из нескольких потоков в одну и ту же таблицу с хинтом APPEND?Перечитай его сообщения.

Ага, не работает.. виноват.

Тогда, как уже писали и упоминал автор - APPEND_VALUES с одним потоком.

Ну и DELETE, я бы заменил на truncate в самом конце, когда все данные скопировались.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837611
large5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
read by other session это плохо .
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837988
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FogelMinistrBob....
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022
....

MinistrBob....
Но на самом деле когда система вводилась в эксплуатацию лет 7 назад, никто и не предполагал что таблицы будут разрастаться до таких размеров, и ведь ничего оттуда удалять нельзя - все нужное.
....

мало кто знает, что будет с ним через 7 лет, не говоря уже о самой идеальной системе, созданной здесь и сейчас.
Вам(Тебе) нужно не xyйнёй "экстренная тех.поддержка" заниматься, а рефакторить архитектуру, разбив эту неебическую таблицу на множества: партиции, но тут, боюсь, даже они уже не вытянут, а лучше разные таблицы по периодам (кстати до появления партиций вполне себе работающий и, кстати, до сих пор на некоторых системах древней разработки, метод).

Просто так менять что-то в промышленной системе? Заказчику было предложена новая версия ПО, но он не хочет и это его право. А без его решения и оплаты, зачем что-то менять, тем более там не только БД придется менять но еще и приклад. Это вопрос не технический, а организационный.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837996
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob,

Если так хочется отдельное ТС для таблицы и она занимает б о льшую часть, перенеси из ТС другие объекты.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39837997
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousMinistrBobпропущено...

По поводу трассировки хорошая идея, только заказчик не даёт доступ к серверу непосредственно, у меня есть только машина с Toad и учёткой пользователя sysdba, а вот sys у меня нет.
Из Toad можно конечно запустить трассировку, но как потом получить файл, а самое главное его обработать, чего-то не хочеться в сыром трейсе копаться.
Этого более чем достаточно.

Код: plsql
1.
2.
3.
4.
select value from v$system_parameter where name like 'user_dump_dest';
create directory user_dump_dest as '<результат предыдущего запроса>';
select tracefile from v$process where addr in (select paddr from v$session where sid=<трассируемая сессия>);
select bfilename('user_dump_dest','<имя файла>') from dual;



Обработать - можно хоть штатным tkprof, хоть orasrp.

MinistrBobЗапрос гребет из опорной таблицы в которой просто список ID переносимых строк, чтобы понимать что уже перенесено.


После вставки порции 10000 этаже порция ID удаляется из этой таблицы, т.е. да она постоянно обновляется, насчёт интенсивно или нет - не знаю. А что тут можно сделать?
Напрасно.
Просто логируйте максимальный перенесенный вашей же процедурой ID в отдельную табличку и отбирайте по критерию неравенства.

MinistrBobВот текст типовой процедуры (одна из 10).

Избавьтесь от delete, он не нужен.

Отдельное спасибо за процедуру трассировки без доступа к серверу!

Toad позволяет получить ADDM - но там ничего критичного, самое большое ожидание сессии - direct path read. А что сделаешь с этим, я полагаю что ничего. В конечно итоге всё упирается в железо.

Смысл все канители с удалениями в том что там 10 таких процедур параллельно запускаються - это раз, а еще всё это частенько падает или останавливается - т.е. нужно много кратно перезапускать. Я раньше делал, без опорной таблицы, через minus выявлял что уже перенесено, но на огромных объемах этот minus работал часами и каждый перезапуск очень долго запускался.
С опорной таблицей всё гораздо быстрее.
А замеры времени каждого куска кода показали что медленнее всего именно insert, а delete на его фоне в разы быстрее.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838002
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagorandrey_anonymous,

Я бы на месте автора сделал бы немного по другому.
Создал бы таблицу, содержащую инфу для параллельной обработки, в которой бы хранил диапазоны ID, которые необходимо перенести в рамках одной таски

....

как вариант почитайте еще про DBMS_PARALLEL_EXECUTE

В механизме есть такая таблица, посмотри курсор в процедуре выбирает один чанк

Код: plsql
1.
2.
3.
OPEN l_cursor FOR
      select d.* from ela_document d 
      where d.elado_document_id in (select id from ela_doc_chunks where chunk# = 10);



Таких чанков 10. Таблица создаётся так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE ELA_DOC_CHUNKS
(
   ID       NUMBER,
   CHUNK#   NUMBER
)
TABLESPACE USERS
NOLOGGING;

INSERT INTO ELA_DOC_CHUNKS (ID, CHUNK#)
   SELECT ELADO_DOCUMENT_ID, ORA_HASH (ELADO_DOCUMENT_ID, 10) AS chunk#
     FROM ela_document;



А параллельность обеспечивается тем что 10 чанков запускаются через DBMS_SCHEDULER (вместо DBMS_PARALLEL_EXECUTE)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838006
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagorПлюс нужно понимать, что параллельные insertы не всегда работают лучше одиночного, так как работа в таком режиме идёт в основном с дисками, а не с CPU(10046 level 8 покажет какие ожидания доминируют, как уже сказали выше)


Я провел эксперимент и в insert заменил хин append (который не работает = игнорируется из-за фразы values в insert) на append_values. Только пришлось запустить в один поток, потому что при такой вставке таблица эксклюзивно блокируется и если запустить несколько потоков параллельно, они тупо стоят и ждут.
И append_values работает гораздо быстрее, за счёт реальной direct вставки, но замеры временных показателей показали, что несмотря на то что каждый в отдельности процесс append выполняется медленнее append_values но за счёт того что их 10, они параллельно быстрее раза в два ушатают всю таблицу.

Так что отказался от идеи append_values и одного процесса.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838010
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морейMinistrBobСмысл в PL\SQL и разбиении на маленькие порции в задаче.
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022 и больше его расширять не получиться.
На оборудовании заказчика такая операция оценочно идет 20-30 дней.
Поэтому нужен процесс переноса, который можно перезапускать многократно.
Пробовали alter table ... move и dbms_redefinition - не подходит в данном случае. Если эти процессы падают, а они падают это время и не один раз, а еще иногда просят остановить всё потому что тормозит всё сильно. Поэтому нужен полностью управляемый код, который можно править как хочешь.
виртуально делите исходную таблицу на N сопоставимого размера кусков, через dbms_parallel_execute.create_chunks_by_rowid/create_chunks_by_number_col, либо DIY parallelism .

куски грузим последовательно, в один поток, но с enable_parallel_dml и выставленным DOP. примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
begin 
for c in (select start_rowid, end_rowid from DBA_PARALLEL_EXECUTE_CHUNKS ) loop
insert /*+append parallel(32) no_gather_optimizer_statistics*/ into target select * from source where rowid between c.start_rowid and c.end_rowid;
commit;
end loop;
end;


конкретные N и DOP подбирать по ситуации и тестировать. чем меньше N, тем меньше времени займет процесс от начала до конца, но тем выше будет цена падения процесса загрузки одного куска.

Вот это интересно, покурю :)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838012
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob,

Сделай вставку в 10 потоков с append_values в 10 таблиц, потом их склей в партиции целевой таблицы
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838013
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
watsonMinistrBobТаких процедур выполняется 10 шт, т.е. 10 потоков, и в каждом потоке еще и вставка идет порциями по 10000 строк.

Интересно, как у вас работает параллельная вставка из нескольких потоков в одну и ту же таблицу с хинтом APPEND?

Нормально работает. Из за фразы values в insert хинт append просто игнорируется и выполняются обычные (conventional) insert.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838015
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-MinistrBob,

Если так хочется отдельное ТС для таблицы и она занимает б о льшую часть, перенеси из ТС другие объекты.

Уже сделано, но там других объектов было с гулькин нос, так что освободившееся место даст времени на перенос таблицы.
Кроме этого из самой таблицы удалили всё что только можно, но удалить там можно было тоже очень мало чего.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838018
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragrafMinistrBob,

Сделай вставку в 10 потоков с append_values в 10 таблиц, потом их склей в партиции целевой таблицы

А чего можно отдельные таблицы склеивать в партиционированную таблицу? по какому тогда признаку они будут у меня партиционироваться, вставка ведь беспорядочно идет?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838021
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBob-2-MinistrBob,

Если так хочется отдельное ТС для таблицы и она занимает б о льшую часть, перенеси из ТС другие объекты.

Уже сделано, но там других объектов было с гулькин нос, так что освободившееся место даст времени на перенос таблицы.
Кроме этого из самой таблицы удалили всё что только можно, но удалить там можно было тоже очень мало чего. само по себе удаление данных из таблицы, без дополнительных телодвижений, не освобождает место в ТП - только в самой таблице и только для conventional insert.

возможно вам имеет смысл секционировать таблицу, например по какой-то дате, и хранить каждую секцию в своем tablespace, пропорциональном размеру секции (например секция размером в месяц, ТП размером в год, в нем 12 секций).
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838022
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobА чего можно отдельные таблицы склеивать в партиционированную таблицу?Можно обменивать таблицу и партицию.MinistrBob-2-Если так хочется отдельное ТС для таблицы и она занимает б о льшую часть, перенеси из ТС другие объекты.Уже сделано, но там других объектов было с гулькин нос, так что освободившееся место даст времени на перенос таблицы.
Кроме этого из самой таблицы удалили всё что только можно, но удалить там можно было тоже очень мало чего.Если TS и так не занят другими объектами, в чем тогда смысл переливания из пустого в порожнее.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838034
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBobВ механизме есть такая таблица, посмотри курсор в процедуре выбирает один чанк
Попробуйте понять разницу между "хранятся копии всех айдишников" и "хранятся диапазоны".
вы в рамках каждой таски сейчас делаете удаление такого же количества записей, какое и вставляете в новую таблицу. в то время, как от этого можно(нужно) отказаться+доп.расходы на коллекции, которые в общем то тоже не особо нужны
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838193
watson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MinistrBob
ElicНе гонять через PL/SQL.

Смысл в PL\SQL и разбиении на маленькие порции в задаче.
Нужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022 и больше его расширять не получиться.
На оборудовании заказчика такая операция оценочно идет 20-30 дней.
Поэтому нужен процесс переноса, который можно перезапускать многократно.
Пробовали alter table ... move и dbms_redefinition - не подходит в данном случае. Если эти процессы падают, а они падают это время и не один раз, а еще иногда просят остановить всё потому что тормозит всё сильно. Поэтому нужен полностью управляемый код, который можно править как хочешь.



А как вариант, разбить табличку на бОльшее количество чанков. На столько, чтобы вставка одного чанка занимала "малое" время.
Тогда вместо FORALL
Код: plsql
1.
2.
insert into t1
select * from t2 where chunk_id = :1;



И оставить те же 10 параллельных потоков для обработки, условно, 1000 небольших чанков.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838760
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морейMinistrBobпропущено...


Уже сделано, но там других объектов было с гулькин нос, так что освободившееся место даст времени на перенос таблицы.
Кроме этого из самой таблицы удалили всё что только можно, но удалить там можно было тоже очень мало чего. само по себе удаление данных из таблицы, без дополнительных телодвижений, не освобождает место в ТП - только в самой таблице и только для conventional insert.

возможно вам имеет смысл секционировать таблицу, например по какой-то дате, и хранить каждую секцию в своем tablespace, пропорциональном размеру секции (например секция размером в месяц, ТП размером в год, в нем 12 секций).

Заказчик боится такие действия делать. Мотивируется это тем что работу приклада с партиционированными таблицами никто не тестировал, поэтому нефиг это делать.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838767
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-MinistrBobА чего можно отдельные таблицы склеивать в партиционированную таблицу?Можно обменивать таблицу и партицию.MinistrBobпропущено...
Уже сделано, но там других объектов было с гулькин нос, так что освободившееся место даст времени на перенос таблицы.
Кроме этого из самой таблицы удалили всё что только можно, но удалить там можно было тоже очень мало чего.Если TS и так не занят другими объектами, в чем тогда смысл переливания из пустого в порожнее.

Потому что единственный сегмент в этом ТП, таблица которая сейчас переносится в другое ТП, разросся до размеров ТП. А увеличить ТП нельзя, т.к. достигнуто предельное количество файлов = 1022. Новое ТП создано с большим размером блока = 16Кб и поэтому таблица переезжает сюда чтобы иметь возможность расти дальше.
Про партиционирование написал выше - заказчик пока против партиционирования.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838769
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagorMinistrBobВ механизме есть такая таблица, посмотри курсор в процедуре выбирает один чанк
Попробуйте понять разницу между "хранятся копии всех айдишников" и "хранятся диапазоны".
вы в рамках каждой таски сейчас делаете удаление такого же количества записей, какое и вставляете в новую таблицу. в то время, как от этого можно(нужно) отказаться+доп.расходы на коллекции, которые в общем то тоже не особо нужны

Спасибо, присмотрюсь повнимательнее, попробую понять разницу.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838776
MinistrBob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
watson
А как вариант, разбить табличку на бОльшее количество чанков. На столько, чтобы вставка одного чанка занимала "малое" время.
Тогда вместо FORALL
Код: plsql
1.
2.
insert into t1
select * from t2 where chunk_id = :1;



И оставить те же 10 параллельных потоков для обработки, условно, 1000 небольших чанков.


Да как вариант. Это похоже на то что предлагает feagor . Можно будет попробовать.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39838826
IMNO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтопandrey_anonymous
Код: plsql
1.
2.
3.
4.
select value from v$system_parameter where name like 'user_dump_dest';
create directory user_dump_dest as '<результат предыдущего запроса>';
select tracefile from v$process where addr in (select paddr from v$session where sid=<трассируемая сессия>);
select bfilename('user_dump_dest','<имя файла>') from dual;




Почему ни одна редиска не скинула мне подобный кусок в моей теме ? Это что какое-то тайное знание?

Два чая джентльмену andrey_anonymous!
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842488
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMNOПочему ни одна редиска не скинула мне подобный кусок в моей теме ?
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271615&msg=21546909
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842636
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Код: plsql
1.
select value from v$system_parameter where name like 'user_dump_dest';



Кстати не всегда указывает туда куда надо.
Пока самым надежным вариантом кажется такой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare
  vpath varchar2(500);
  slash char(1);
  function is_windows_server return int is
  begin
    if instr(dbms_utility.port_string, 'WIN_') > 0 then
      return 1;
    else
      return 0;
    end if;
  end;
begin
  slash := case is_windows_server when 1 then '\' else '/' end;
  select substr(tracefile,1,instr(tracefile, slash, -1))
  into   vpath
  from   v$process
  where  rownum = 1;
  DBMS_OUTPUT.PUT_LINE(vpath);
end;
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842643
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagorКстати не всегда указывает туда куда надо.

Пример, когда из всех параметров правильно указывал только _diag_adr_trace_dest
12.2с
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842699
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobВ чем может быть причина замедления FORALL INSERT?

Несколько разных сессий выполняют вот такую процедуру вставки строк. Процедура приведена не полностью, но замеры времени выполнения участков кода, показывают что именно время выполнение этого кода возрастает.

Здесь выполняется INSERT через FORALL порциями по 10000 строк. Таблица, в которую выполняется вставка, совершенно пустая – вновь созданная, нет никаких триггеров, никаких индексов , но она LOGGING. Чем дальше, тем больше становиться время вставки порции строк. Т.е. скорость процесса всё время плавно уменьшается.

Хинт APPEND здесь не работает (это подтверждается планом в котором говориться что conventional insert (не direct)). Пробовал заменить на APPEND_VALUES – в этом случае сессии начинают блокировать друг друга, появляется ожидание «enq: TM – contention» и всё тормозит еще сильнее.

Ожидания этой сессии, отсортировано по TIME_WAITED, ничего криминального тут не вижу.
EVENT;TIME_WAITEDdirect path read;262343db file sequential read;9715read by other session;6161db file parallel read;736direct path read temp;426Disk file operations I/O;218direct path write temp;81direct path write;46latch: cache buffers chains;9library cache load lock;7log file switch (private strand flush incomplete);3cursor: pin S wait on X;2library cache: mutex X;1events in waitclass Other;1latch: shared pool;0latch: row cache objects;0enq: HW - contention;0buffer busy waits;0


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN
   OPEN l_cursor FOR
      SELECT *
        FROM ela_document
       WHERE id BETWEEN X1 AND X2;

   LOOP
      BEGIN
         FETCH l_cursor BULK COLLECT INTO l_data LIMIT 10000;

         FORALL i IN 1 .. l_data.COUNT
            INSERT /*+ APPEND */
                  INTO  ela_document_copy
                 VALUES l_data (i);

         COMMIT;
      END;

      EXIT WHEN l_cursor%NOTFOUND;
   END LOOP;
END;
/



В чём может быть причина постепенного замедления процесса? И как это исправить?
если уж такой критический случай, я бы сделал объектный тип верхнего уровня с коллекцией, в которую бы фетчил курсор балками тыщ по двадцать-тридцать, и инсертел бы INSERT /*+APPEND PARALLEL*/ INTO ela_document_copy SELECT * FROM TABLE(:X), а коммит делал бы после примерно десяти таких инсертов. Предварительно конечно надо было бы делать ALTER SESSION ENABLE PARALLEL DML
(не прав?)
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842792
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Ты тоже не понимаешь, что значит "не гонять через PL/SQL"? А через объекты тем паче?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842943
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

хорошо, а каким способом фетчить курсор в коллекцию, а затем вставлять as select, не гоняя через PL/SQL?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39842983
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Кто тебе сказал, что нужен курсор?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843059
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--инсертел бы INSERT /*+APPEND PARALLEL*/ INTO ela_document_copy SELECT * FROM TABLE(:X), а коммит делал бы после примерно десяти таких инсертов
отвалится уже на втором.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843060
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MinistrBobНужно перебросить таблицу размером 30Тб из одного ТП в другое, потому что уже максимум файлов в ТП - 1022 и больше его расширять не получиться.соррь, не осилил весь топик целиком, а почему просто не создать секционированную таблицу в том же тейблспейсе и не сделать туда alter table exchange partition, а потом уже создать новую секцию в другом и чтобы новые данные туда лились?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843076
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderсоррь, не осилил весь топик целиком, а почему просто не создать секционированную таблицу
21929440
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843078
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinistrBobкит северных морейпропущено...

виртуально делите исходную таблицу на N сопоставимого размера кусков, через dbms_parallel_execute.create_chunks_by_rowid/create_chunks_by_number_col, либо DIY parallelism .

куски грузим последовательно, в один поток, но с enable_parallel_dml и выставленным DOP. примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
begin 
for c in (select start_rowid, end_rowid from DBA_PARALLEL_EXECUTE_CHUNKS ) loop
insert /*+append parallel(32) no_gather_optimizer_statistics*/ into target select * from source where rowid between c.start_rowid and c.end_rowid;
commit;
end loop;
end;


конкретные N и DOP подбирать по ситуации и тестировать. чем меньше N, тем меньше времени займет процесс от начала до конца, но тем выше будет цена падения процесса загрузки одного куска.

Вот это интересно, покурю :)
ТС, покурили? как реализовали в итоге?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843085
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicКто тебе сказал, что нужен курсор?
Если проблема в insert - то не нужен.
Если в select по крупным таблицам - то пусть лучше будет.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843104
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic--Eugene--,

Кто тебе сказал, что нужен курсор?никто мне не говорил, это я спрашиваю: есть задача (для простоты понимания, представь, не связанная с данным топиком) - на входе имеется курсор известной структуры, и весь его нужно переложить в таблицу. предложи лучший способ "перекладывания" ?
задача-то одна из прикладных.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843105
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей--Eugene--инсертел бы INSERT /*+APPEND PARALLEL*/ INTO ela_document_copy SELECT * FROM TABLE(:X), а коммит делал бы после примерно десяти таких инсертов
отвалится уже на втором.сорян, забыл про параллельную херню
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843108
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Elic--Eugene--,

Кто тебе сказал, что нужен курсор?никто мне не говорил, это я спрашиваю: есть задача (для простоты понимания, представь, не связанная с данным топиком) - на входе имеется курсор известной структуры, и весь его нужно переложить в таблицу. предложи лучший способ "перекладывания" ?
задача-то одна из прикладных.
однопоточный FORALL + APPEND_VALUES без объектов. на тех объёмах, которые реалистично прочитать в коллекцию, вы не получите выигрыша от parallel dml.
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843110
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей..APPEND_VALUES..слышал, будто от него пользы совсем не столько, сколько ожидаешь.. не уж то слухи? или он иначе работает в случае с FORALL ?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843117
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--или он иначе работает в случае с FORALL ?
Эээ... А он как-то может работать без forall?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843122
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousА он как-то может работать без forall?простой insert values не рассматриваете ?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843124
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--andrey_anonymousА он как-то может работать без forall?простой insert values не рассматриваете ?
В режиме append?
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843126
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВ режиме append?я к тому, что это тоже возможно
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843130
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--кит северных морей..APPEND_VALUES..слышал, будто от него пользы совсем не столько, сколько ожидаешь.. не уж то слухи? или он иначе работает в случае с FORALL ?
в написанном на скорую руку тесте получил выигрыш в 30 секунд - 90 секунд на forall append_values против 120 на conventional forall. судите сами. стоит отметить, что во многих случаях скорость далеко не единственный фактор при выборе.

p.s. только сейчас вспомнил. если совсем делать нечего, можете ещё поиграться с parallel pipelined (пример есть у Тома по ссылке выше).
...
Рейтинг: 0 / 0
В чем может быть причина замедления FORALL INSERT?
    #39843307
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морейparallel pipelined
С точки зрения производительности на значительных объемах у этой технологии есть неприятные ньюансы, хотя в целом - работает.
...
Рейтинг: 0 / 0
66 сообщений из 66, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем может быть причина замедления FORALL INSERT?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]