我当前的客户项目要求我使用Oracle数据库(11g)。我以前的大多数数据库经验是使用mssql服务器、access和mysql。我最近遇到了一个对我来说非常奇怪的问题,我希望有人能提供一些清晰的信息。
我想做如下声明:

update MYTABLE set COLUMN_A = COLUMN_B;

MyTable大约有1300万行。
源列已编制索引(column_b),但目标列未编制索引(column_a)
主键字段是一个guid。
这似乎运行了4个小时,但似乎从未完成。
我采访了一位比我更熟悉Oracle的前开发人员,他们告诉我,通常会创建一个过程,将其分解为要提交的数据块(大约1000条记录)。这个过程将遍历1300万条记录并提交1000条记录,然后提交下一个1000条…通常根据主键来分解数据。
这听起来有点傻,我从我与其他数据库系统的经验。我不会加入另一个表,也不会链接到另一个数据库。我只是把数据从一列复制到另一列。我不认为一千三百万的记录是大的,因为有系统在那里,以十亿记录的顺序。我无法想象在一个表中复制一个简单的数据列需要计算机一个小时又一个小时(结果失败了),而整个表只占用不到1 GB的存储空间。
在尝试其他方法来实现我的愿望时,我尝试了以下几点:
create table MYTABLE_2 as (SELECT COLUMN_B, COLUMN_B as COLUMN_A from MYTABLE);

完成完全相同的最终结果(减去删除第一个表和重命名新表)只需不到2分钟。
为什么更新会运行4小时而失败(只是将一列复制到另一列),但是复制整个表的create table只需要不到2分钟的时间?
是否有任何最佳实践或通用方法用于进行此类更改?谢谢你的帮助!

最佳答案

在我看来确实很奇怪。然而,我想到:
更新表时,必须创建事务日志,以防需要回滚。创建一个表,这是不必要的。

07-26 04:43
查看更多