powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переливка данных с ограничением нагрузки на БД
25 сообщений из 35, страница 1 из 2
Переливка данных с ограничением нагрузки на БД
    #39169456
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть две таблицы.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table user.table_old
(
  id                 number(21)                 not null,
  name               varchar2(1000 char)        not null,
  date_main          date                       not null
);

create table user.table_new
(
  id                 number(21)                 not null,
  name               varchar2(1000 char)        not null,
  date_main          date                       not null
)
partition by range (date_main)
interval (numtodsinterval(3, 'day')) 
(
partition p1 values less than (to_date(' 2010-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=gregorian'))
);


В старой таблице 100 миллионов строк, например, и надо перелить из старой в новую 10 миллионов строк по условию where date_main >= trunc(sysdate-7).
При переливке БД не должна тормозить (продолжительность не имеет большого значения), поэтому вариант
Код: sql
1.
2.
3.
4.
5.
insert into user.table_new (id, name, date_main)
    select id, name, date_main
    from user.table_old
    where date_main >= trunc(sysdate-7);
commit;


не подходит, как я понимаю.
Что же делать? Вставлять построчно через цикл?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
for i in ( select id, name, date_main
           from user.table_old
           where date_main > trunc(sysdate-7) ) loop
               insert into user.table_new (id, name, date_main)
               values (i.id, i.name, i.date_main)
               commit;
               sleep(1/500);
           end loop;
end;
/
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169469
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907При переливке БД не должна тормозитьУ тебя какие-то странные критерии тормознутости.
140907Что же делать?CTAS + exchange partition.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169478
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907,

Как раз таки инсертом будет быстрее.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169483
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Про тормознутость - надо чтобы БД оставалась отзывчивой для приложений и других пользователей во время переливки данных (т.е. чтобы никому не мешать).
Про "CTAS + exchange partition" почитаю, спасибо.
А у приведенного цикла какие недостатки (кроме продолжительности)?
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169484
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907,

кстати , на твой слип уйдет больше времени, чем на вставку :D
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169490
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601
Боюсь, времени потребуется больше, т.к. даже простой селект
Код: sql
1.
2.
3.
select count(id)
from user.table_old
where date_main >= trunc(sysdate-7)


занимает секунд 20.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169502
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907,
А ты не бойся и попробуй. Заодно выложи сюда результаты loop (только убери слип а то только на него уйдет 20.000 сек), insert, можешь еще дать результат exchange partition.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169704
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601
Мы говорим немного о разном. Мне не важно, сколько времени (10, 20, 30 минут) будет выполниться копирование строк из старой таблицы в новую. Главное - чтобы копирование не мешало другим пользователям работать с БД. Пока что я заметил, что при активной вставке в какую-либо таблицу (без триггеров) вся БД начинает "тормозить". Поэтому использую sleep - медленно, зато никому не мешаю.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169732
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907Пока что я заметил, что при активной вставке в какую-либо таблицу (без
триггеров) вся БД начинает "тормозить".
Ну так и разбирайся с причиной этих тормозов, а не подставляй костыли наобум.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169914
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Жесткий стиль. Зря.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39169974
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907Жесткий стиль. Зря.
Тебе дело говорят. Кто ж тебе поможет, если ты слушать не хочешь? У меня вот похожая ситуация - нужно удалить пол-миллиарда строк из таблички "так, чтобы было незаметно для пользователей". Работаю над этим, исследую на чём тормозит. И тебе того же желаю :)
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39170302
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходил мимо...
Если найдете решение, пожалуйста, напишите в эту тему.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39170305
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CTAS не подходит (я в примере не указал все колонки обеих таблиц, каюсь, а одна из них - виртуальная, а CTAS делает из нее обычную).
А Exchange Partition, похоже, подойдет :)
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39170422
dbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbi
Гость
140907,

Можно экспортнуть из старой таблицы что-то типа:

expdp include=TABLE:"IN ('EMP')" query=emp:"where date_main > ???"

Дальше через импорт попробовать, может быть не будет тормозить. Как вариант ограничить нагрузку через файловую систему. Можно временно помувать таблицу в другой тебйлспейс, чтобы тот размещался в другом маунпоинте. Беда в том, что как понимаю, проблема происходит из-за нагруженности файловой системы. С этим всегда сложновато бороться.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39170423
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907CTAS не подходит (я в примере не указал все колонки обеих таблиц, каюсь, а одна из них - виртуальная, а CTAS делает из нее обычную).Ну если ты используешь звёздочку, то тем самым только измеряешь собственную глупость.
140907А Exchange Partition, похоже, подойдет :)С твоим partitioning и без CTAS? Мозг не включился?
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171004
Lunaire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907Elic
А у приведенного цикла какие недостатки (кроме продолжительности)?

Commit после каждой вставленной строчки, это плохая идея. БД может подвиснуть на log_file_sync. Вставлять в одной транзакции 10 млн тоже не хорошо, т.к. может потребоваться много undo, а штатные запросы тогда полетят по ora-01555 или ORA-30036. Можно попробовать найти баланс.

А вообще CTAS - хорошее решение. Если возникнут тормоза, надо смотреть план запроса, AWR, ASH.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171008
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907проходил мимо...
Если найдете решение, пожалуйста, напишите в эту тему.
"Мальчик, как тебя зовут?" (с)
ПОСМОТРИ НА ЧЁМ У ТЕБЯ ТОРМОЗИТ. Напиши об этом сюда - постараемся помочь.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171017
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lunaire140907Elic
А у приведенного цикла какие недостатки (кроме продолжительности)?

Commit после каждой вставленной строчки, это плохая идея. БД может подвиснуть на log_file_sync. Вставлять в одной транзакции 10 млн тоже не хорошо, т.к. может потребоваться много undo, а штатные запросы тогда полетят по ora-01555 или ORA-30036. .

ну допустим вот так. Вставлять понемногу. Мне помогает, но по причине хренового знания теории объяснить не смогу((((
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 declare
   type tn is table of number;
   type tv is table of varchar2(...);
   type td is table of date;
   
   cursor c is 
   select id, name, date_main
           from user.table_old
           where date_main > trunc(sysdate-7) );
   l_id tn;
   l_nm tv;
   l_d td;
 begin
    open c;
      fetch c bulk collect into l_id,l_nm,l_d limit 100000;
      forall i in l_id.first()..l_id.last() 
        insert into insert into user.table_new (id, name, date_main)
          values (l_id(i),l_nm(i),l_d(i));
      commit;
      exit when c%notfound;
    close c;
 end;
 
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171342
Jarod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может проще использовать Resource Manager И просто зарезать пользователю CPU...
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171402
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Resource Manager достаточно плохо управляется с IO. Если "узкое горлышко" диски, то с первого раза приемлемо настроить вряд ли получится IMHO & AFAIK
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171554
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
140907,

А Вы пробовали захинтовать
Код: plsql
1.
insert /*+append*/ .... select  /*+parallel(...)*/



Может так оно будет проскакивать быстрее, общее время "тормозов" сократится и всем станет легче?

Если опытные коллеги пояснят, когда от этого только хуже - буду благодарен.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171611
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЕсли опытные коллеги пояснят, когда от этого только хуже - буду благодарен.
Если вставляются данные, захватывающие много партиций, +append добавит новый экстент к каждой затронутой партиции. Иногда это может быть убийственно.
Ну и от +parallel(очень много) поплохеть всем может значительно быстрее :)
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39171656
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходил мимо... - Согласен.
Правильно ли я прочитал,
Код: plsql
1.
2.
3.
4.
5.
partition by range (date_main)
interval (numtodsinterval(3, 'day')) 
(
partition p1 values less than (to_date(' 2010-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss', 'nls_calendar=gregorian'))
);


что новая таблица партиционирована по три дня, т.е. недельный запрос покроет (и нарастит) 3 партиции ?
может и не страшно.
Код: plsql
1.
2.
from user.table_old
    where date_main >= trunc(sysdate-7);



а если подгадать моменты вставки раз в 3-6-9 дней - то можно и вовсе попадать строго в нужную партиции.

Ну и конечно, слишком много параллелей ставить наверное не стоит.... тоже согласен.
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39172724
140907
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто хочет помочь. Я пока не могу продолжить беседу. Через день-два :)
...
Рейтинг: 0 / 0
Переливка данных с ограничением нагрузки на БД
    #39173142
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovПравильно ли я прочитал
Не в том проблема.
Если у нас партиции за прошедший год по три дня и там уже есть данные, то вставка +append по одной строке на каждый день прошедшего года заставит выделить новый экстент в 122х партициях. А экстенты могут быть и по 8-64 Мб каждый .
А если этот самый +append ещё и делать регулярно...
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переливка данных с ограничением нагрузки на БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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