Выполнить несколько операторов Oracle SQL одновременно - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть база данных Oracle, которая имеет 20 очень больших таблиц, каждая с сотнями разделов.Я могу сжать стол, но это занимает более 2 часов.Это будет означать более 40 часов для заполнения всех 20 таблиц.Я хотел бы запустить сжатие разделов одновременно (1 на таблицу).Поскольку разделы добавляются ежедневно, мне нужна утилита для генерации синтаксиса "изменить таблицу ..." во время выполнения.Пока что все, о чем я могу думать, - это создать SQL для каждой из 20 таблиц и их разделов, а затем запустить их в 20 сеансах SQLPlus.

Есть ли лучший, более автоматизированный способ сделать это?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете отправить несколько заданий, которые, в свою очередь, одновременно выполнят ваш код .Вот пример:

Тестовые таблицы - я хочу изменить тип данных ID на VARCHAR2(10)

SQL> create table t1 (id varchar2(2));

Table created.

SQL> create table t2 (id varchar2(2));

Table created.

SQL> create table t3 (id varchar2(2));

Table created.

Процедура, которая будет использовать EXECUTE IMMEDIATE и вызываться из DBMS_JOB (см. Ниже):

SQL> create or replace procedure p_exe (par_what in varchar2) is
  2  begin
  3    execute immediate par_what;
  4  end;
  5  /

Procedure created.

Создание заданий, которые будут одновременно запускать ALTER TABLE

SQL> declare
  2    l_str varchar2(200);
  3    l_job number;
  4  begin
  5    for cur_r in (select 't1' table_name from dual union all
  6                  select 't2'            from dual union all
  7                  select 't3'            from dual)
  8    loop
  9      l_str := 'alter table ' || cur_r.table_name || ' modify id varchar2(10)';
 10      dbms_output.put_line(l_str);
 11      dbms_job.submit(l_job,
 12                      'p_exe(' || chr(39) || l_str || chr(39) ||');',
 13                      sysdate
 14                     );
 15      commit;
 16    end loop;
 17  end;
 18  /

PL/SQL procedure successfully completed.

Задания теперь выполняются;через несколько мгновений (в моем случае, поскольку это простой - вы бы проверили это несколько позже), проверьте, что делается:

SQL> desc t1;
 Name                    Null?    Type
 ----------------------- -------- ----------------
 ID                               VARCHAR2(10)

SQL> desc t3;
 Name                    Null?    Type
 ----------------------- -------- ----------------
 ID                               VARCHAR2(10)

SQL> desc t3;
 Name                    Null?    Type
 ----------------------- -------- ----------------
 ID                               VARCHAR2(10)

SQL>
...