Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переливка данных с ограничением нагрузки на БД / 25 сообщений из 35, страница 1 из 2
12.02.2016, 12:27
    #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
12.02.2016, 12:39
    #39169469
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
140907При переливке БД не должна тормозитьУ тебя какие-то странные критерии тормознутости.
140907Что же делать?CTAS + exchange partition.
...
Рейтинг: 0 / 0
12.02.2016, 12:44
    #39169478
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
140907,

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

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


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

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

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

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

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

А вообще CTAS - хорошее решение. Если возникнут тормоза, надо смотреть план запроса, AWR, ASH.
...
Рейтинг: 0 / 0
15.02.2016, 09:36
    #39171008
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
140907проходил мимо...
Если найдете решение, пожалуйста, напишите в эту тему.
"Мальчик, как тебя зовут?" (с)
ПОСМОТРИ НА ЧЁМ У ТЕБЯ ТОРМОЗИТ. Напиши об этом сюда - постараемся помочь.
...
Рейтинг: 0 / 0
15.02.2016, 09:56
    #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
15.02.2016, 14:36
    #39171342
Jarod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
Может проще использовать Resource Manager И просто зарезать пользователю CPU...
...
Рейтинг: 0 / 0
15.02.2016, 15:07
    #39171402
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
Resource Manager достаточно плохо управляется с IO. Если "узкое горлышко" диски, то с первого раза приемлемо настроить вряд ли получится IMHO & AFAIK
...
Рейтинг: 0 / 0
15.02.2016, 16:54
    #39171554
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
140907,

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



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

Если опытные коллеги пояснят, когда от этого только хуже - буду благодарен.
...
Рейтинг: 0 / 0
15.02.2016, 17:33
    #39171611
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
Vladimir BaskakovЕсли опытные коллеги пояснят, когда от этого только хуже - буду благодарен.
Если вставляются данные, захватывающие много партиций, +append добавит новый экстент к каждой затронутой партиции. Иногда это может быть убийственно.
Ну и от +parallel(очень много) поплохеть всем может значительно быстрее :)
...
Рейтинг: 0 / 0
15.02.2016, 18:05
    #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
17.02.2016, 00:15
    #39172724
140907
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
Спасибо всем, кто хочет помочь. Я пока не могу продолжить беседу. Через день-два :)
...
Рейтинг: 0 / 0
17.02.2016, 13:49
    #39173142
проходил мимо...
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переливка данных с ограничением нагрузки на БД
Vladimir BaskakovПравильно ли я прочитал
Не в том проблема.
Если у нас партиции за прошедший год по три дня и там уже есть данные, то вставка +append по одной строке на каждый день прошедшего года заставит выделить новый экстент в 122х партициях. А экстенты могут быть и по 8-64 Мб каждый .
А если этот самый +append ещё и делать регулярно...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переливка данных с ограничением нагрузки на БД / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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