我必须更新一个包含1000万条记录(大小为84 GB)的表,并且可以实时从多个系统获取数据。
我必须将列的大小从3个char扩展到5个char,因为所有新数据将来自此特定字段的5个字符。
我是否需要重新索引表格才能更快地进行此更改?
在更新活动期间,是否需要停止提供此表的cron作业?
对上述内容的一些澄清:
我会使用此查询来更改列:
ALTER TABLE tablename MODIFY cloumnname char(5)
我们使用Oracle数据库。
以下是我的问题:
答案 0 :(得分:0)
TL; TR:将其更改为varchar2(5)
,不要坚持使用char
首先使用char()
是一个坏主意。由于char
值被填充到定义的长度,因此Oracle确实需要重写表以便能够增加大小。 char
数据类型在varchar2
类型上没有任何优势 - 只有缺点,填充和增加其大小时的开销是其中两个。
如果您现在必须增加大小,还应该将列修改为varchar,以便将来的更改不需要重写整个表。
您可以看到以下测试脚本的不同之处:
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> desc alter_test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
SOME_COLUMN CHAR(3)
SOME_TS TIMESTAMP(6)
OTHER_DATA NUMBER
SQL> select count(*) from alter_test;
COUNT(*)
----------
11520000
SQL> set timing on
SQL> alter table alter_test modify some_column char(5);
Table altered.
Elapsed: 00:01:48.19
SQL> desc alter_test2
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
SOME_COLUMN VARCHAR2(3)
SOME_TS TIMESTAMP(6)
OTHER_DATA NUMBER
SQL> select count(*) from alter_test2;
COUNT(*)
----------
11520000
SQL> alter table alter_test2 modify some_column varchar2(5);
Table altered.
Elapsed: 00:00:00.00
SQL>
正如您所看到的,增加varchar2
的大小根本不需要时间(相对于增加char
类型超过一分钟)。
因此,如果您想在不影响系统的情况下增加该列的允许大小,只需切换到具有新长度的合理varchar2
类型,并忘记可怕的char
类型。
如果你这样做,这也是一个瞬间操作:
SQL> desc alter_test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
SOME_COLUMN CHAR(3)
SOME_TS TIMESTAMP(6)
OTHER_DATA NUMBER
SQL> select count(*) from alter_test;
COUNT(*)
----------
11520000
SQL> alter table alter_test modify some_column varchar2(5);
Table altered.
Elapsed: 00:00:00.02
SQL>
<强>更新强>
现在从可怕的char
更改为推荐的varchar2
可能会对您的应用产生影响,如果实际上需要空白填充值,就像miracle173指出的那样。如果您的应用程序需要'Y '
而不是'Y'
,那么这可能不是您可以轻松做的事情(除非您也更改了应用程序)。