我有一个Oracle数据库,其中有20个非常大的表,每个表都有数百个分区。我可以压缩一张桌子,但这需要2个小时以上。这将需要40多个小时才能完成所有20张桌子。我想同时运行分区压缩(每个表1个)。因为分区是每天添加的,所以我需要一个实用程序来在运行时生成“ alter table ...”语法。到目前为止,我所能想到的就是为20个表及其分区中的每一个创建一个SQL,然后在20个SQLPlus会话中运行它们。
是否有更好,更自动化的方式来做到这一点?
答案 0 :(得分:0)
您可以提交多个作业,这些作业将依次运行代码 。这是一个示例:
测试表-我想将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>