更新表的更快方法是什么,包含大约1000万条记录?

时间:2018-04-03 13:09:55

标签: sql oracle ddl

我必须更新一个包含1000万条记录(大小为84 GB)的表,并且可以实时从多个系统获取数据。

我必须将列的大小从3个char扩展到5个char,因为所有新数据将来自此特定字段的5个字符。

我是否需要重新索引表格才能更快地进行此更改?

在更新活动期间,是否需要停止提供此表的cron作业?

对上述内容的一些澄清:

我会使用此查询来更改列:

ALTER TABLE tablename MODIFY cloumnname char(5)

我们使用Oracle数据库。

以下是我的问题:

  • 在生产中进行此更改之前,是否需要停止所有日常cron作业?
  • 是否会删除现有索引并禁用触发器会使其更快?

1 个答案:

答案 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',那么这可能不是您可以轻松做的事情(除非您也更改了应用程序)。