修改语句数据类型更新时间过长



我已经尝试将数据类型从BYTE立即更新为CHAR所有列(约100+列)更新。但是当我尝试将CHAR回滚到BYTE时,它的加载速度很慢,特别是有大约8700万条记录的表。

现在我的想法是创建一个临时表,并将数据复制到临时表,然后删除原始表并使用更新的数据类型重新创建。这很好,因为复制数百万条记录到临时表需要很长时间,对于我将要做的多个表。

任何建议吗?

从字节到字符的转换是"即时的";因为我们实际上增加了列的大小。转换回来(可能)是一个减少,因此我们需要检查现有的数据。

然而,很可能我们并没有真正改变数据,我们只是在检查它——所以你可以通过检查这样一个操作之前和之后的重做来看到。这是一个2500万行的表

SID_STAT# NAME                                                                                  VALUE
---------- -------------------------------------------------------------------------------- ----------
313 redo size                                                                        5580874020
SQL>   alter table t modify c1   varchar2(100 byte);
Table altered.
SID_STAT# NAME                                                                                  VALUE
---------- -------------------------------------------------------------------------------- ----------
313 redo size                                                                        5580877992

如果您不能花费时间(表被锁定),那么按照建议,dbms_redefinition在这里可能会有所帮助,但不要忘记-这将移动所有的数据。

SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
PK                                                 NUMBER(38)
C1                                                 VARCHAR2(100 CHAR)
C2                                                 VARCHAR2(100 CHAR)
C3                                                 VARCHAR2(100 CHAR)
C4                                                 VARCHAR2(100 CHAR)
C5                                                 VARCHAR2(100 CHAR)
C6                                                 VARCHAR2(100 CHAR)
C7                                                 VARCHAR2(100 CHAR)
SQL> create table t1 (
2    pk int,
3    c1 varchar2(100 byte),
4    c2 varchar2(100 byte),
5    c3 varchar2(100 byte),
6    c4 varchar2(100 byte),
7    c5 varchar2(100 byte),
8    c6 varchar2(100 byte),
9    c7 varchar2(100 byte)
10  )
11  tablespace largetmp;
Table created.
SQL> exec dbms_redefinition.start_redef_table(user, 'T', 'T1');
PL/SQL procedure successfully completed.
SQL> set serveroutput on
SQL> declare
2    l_err pls_integer;
3  begin
4    dbms_redefinition.copy_table_dependents(
5      uname             => user,
6      orig_table        => 'T',
7      int_table         => 'T1',
8      num_errors        => l_err);
9    dbms_output.put_line('l_err=' || l_err);
10  end;
11  /
l_err=0
PL/SQL procedure successfully completed.
SQL>
SQL> exec dbms_redefinition.finish_redef_table(user, 'T', 'T1');
PL/SQL procedure successfully completed.
SQL>
SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- --------------
PK                                        NOT NULL NUMBER(38)
C1                                                 VARCHAR2(100)
C2                                                 VARCHAR2(100)
C3                                                 VARCHAR2(100)
C4                                                 VARCHAR2(100)
C5                                                 VARCHAR2(100)
C6                                                 VARCHAR2(100)
C7                                                 VARCHAR2(100)

最新更新