Oracle 10g R2特性之数据仓库集成特性(1)(4)
在 Oracle 数据库 10g 第 2 版中,该过程得到显著简化。如下图所示,假设您将分区一直定义到 5 月份,然后已经将 PMAX 分区定义为一个通用分区。由于 6 月份没有特定分区,因此 6 月份数据进入 PMAX 分区。灰显的方框显示了填充到该段中的数据。由于只填充了部分 PMAX 分区,因此您只看到一部分灰色区域。

现在,在 6 月 30 日对分区 PMAX 进行分割,以创建 6 月分区和新的 PMAX 分区。由于当前 PMAX 中的所有数据都将进入新的 6 月分区,因此 Oracle 数据库 10g 第 2 版只创建新的最大值分区,并使现有分区成为新创建的月分区。这就导致了根本不会发生数据移动(因此没有“空”的 I/O 和 CPU 周期)。而最好之处在于,ROWID 不会发生变化。
通过联机重新定义将 LONG 转换为 LOB
如果数据仓库数据库已经存在一段时间,并且您要处理大型文本数据,则您可能拥有大量数据类型为 LONG 的列。毋庸质疑,LONG 数据类型在大多数数据操作环境(如通过 SUBSTR 进行搜索)中是没有用处的。您肯定需要将它们转换为 LOB 列。
可以使用 DBMS_REDEFINITION 程序包联机执行该操作。但在 Oracle 数据库 10g 第 2 之前,有一个很大的限制。
将 LONG 列转换为 LOB 列时,您很希望获得高性能;您需要使该过程尽可能地快。如果将表进行了分区,则该过程将跨分区并行执行。但如果未将表进行分区,则该过程将串行执行,从而可能持续很长时间。
幸好,在 Oracle 数据库 10g 第 2 版中,即使表未分区也可以在 DBMS_REDEFINITION 程序包内部执行从 LONG 到 LOB 的联机转换。我们通过一个示例来了解该转换的过程。以下是一个用于保存发送给客户的电子邮件的表。由于邮件正文(存储在 MESG_TEXT 中)通常是较长的文本数据,因此已将该列定义为 LONG。
|
您需要将该列转换为 CLOB。首先,创建一个结构相同的(最后一列除外,它被定义为 CLOB)空临时表。
|
现在,启动重新定义过程。
|
注意第 6 行,该行已经对列进行了映射。前两列保持不变,但第三列 MESG_TEXT 已被映射,以便通过对源表的列应用函数 TO_LOB 来填充目标表的 MESG_TEXT 列。
如果要重新定义的表很大,则需要定期对源表和目标表之间的数据进行同步。该方法加快了最终同步的速度。
|



