1

我当前的客户项目要求我使用 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 分钟?

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

4

1 回答 1

4

这对我来说似乎很奇怪。然而,这浮现在脑海中:

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

于 2013-09-10T22:51:55.203 回答