在oracle表中将数据从一列复制到另一列

时间:2013-09-10 22:48:48

标签: database oracle oracle11g relational-database

我当前的客户项目要求我使用Oracle数据库(11g)。我以前的大部分数据库经验都是使用MSSQL Server,Access和MySQL。我最近遇到了一个对我来说非常奇怪的问题,我希望有人能说清楚。

我希望做一个如下声明:

update MYTABLE set COLUMN_A = COLUMN_B;

MYTABLE有大约1300万行。

源列已编制索引(COLUMN_B),但目标列不是(COLUMN_A)

主键字段是GUID。

这似乎运行了4个小时,但似乎永远不会完成。

我与一位比我更熟悉Oracle的前开发人员谈过,他们告诉我你通常会创建一个程序,将其分解为要提交的数据块(大约1000条记录左右)。此过程将遍历1300万条记录并提交1000条记录,然后提交下一条1000条...通常会根据主键断开数据。

根据我对其他数据库系统的经验,这听起来有些愚蠢。我没有加入另一个表,或链接到另一个数据库。我只是将数据从一列复制到另一列。考虑到数十亿条记录的订单中有系统,我不认为1300万条记录很大。我无法想象在一个表中复制一个简单的数据列需要一个小时和几小时的计算机(只是失败),整个表占用的存储空间不到1 GB。

在尝试完成我想要的替代方法时,我尝试了以下方法:

create table MYTABLE_2 as (SELECT COLUMN_B, COLUMN_B as COLUMN_A from MYTABLE);

完成相同的最终结果只需不到2分钟(减去第一个表并重命名新表)。

为什么UPDATE运行4小时而失败(只是将一列复制到另一列),但复制整个表的create table只需不到2分钟?

是否有任何最佳实践或常用方法来进行此类更改?谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

这对我来说确实很奇怪。但是,我想到了这一点:

更新表时,必须创建事务日志以防需要回滚。创建一个没有必要的表。