我已经尝试将数据类型从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)