【发布时间】:2013-08-26 15:56:05
【问题描述】:
我有一个 Composite-List-List 分区表,它有 19 列和大约 4 亿行。每周在此表中插入一次新数据,在插入之前,我需要将特定分区的 2 列的值设置为 null。
明显的方法如下所示,其中 COLUMN_1 是分区标准:
UPDATE BLABLA_TABLE
SET COLUMN_18 = NULL, SET COLUMN_19 = NULL
WHERE COLUMN_1 IN (VALUE1, VALUE2…)
当然这会非常慢。
我的第二个想法是对我需要将这两列设置为 null 的每个分区使用 CTAS,然后使用 EXCHANGE PARTITION 更新我的大表中的数据。不幸的是,这行不通,因为它是一个复合分区。
我可以对子分区使用相同的方法,但是我必须使用 CATS 大约 8000 次,然后每周删除这些表。我猜这不会通过即将到来的代码审查。
可能有人有另一个想法如何有效地解决这个问题?
PS:我使用 ORACLE 11g 作为数据库。 PPS:对不起我的英语不好……..
【问题讨论】:
-
要更新多少行?你会更新整个子分区吗?更新前这些列中的数据有多大(估计撤消日志)?
-
我将分别更新整个分区,该分区中每个子分区的所有行不为空(大约 90%)。将更新大约 120.000.000 万行。 COLUMN_18 定义为 NUMBER(10,4),COLUMN_19 定义为 NUMBER(10)。