龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

Oracle 10g R2特性之数据仓库集成特性(1)(4)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
在 Oracle 数据库 10g 第 2 版中,该过程得到显著简化。如下图所示,假设您将分区一直定义到 5 月份,然后已经将 PMAX 分区定义为一个通用分区。由于 6 月

在 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。

SQL> desc acc_mesg
Name                              Null?Type
----------------------------------------- -------- ---------

ACC_NO                                    NOT NULL NUMBER
MESG_DT                                   NOT NULL DATE
MESG_TEXT                                          LONG

您需要将该列转换为 CLOB。首先,创建一个结构相同的(最后一列除外,它被定义为 CLOB)空临时表。

create table ACC_MESG_INT
(
acc_no number,
mesg_dt  date,
mesg_text clob
);

现在,启动重新定义过程。

1 begin

2 dbms_redefinition.start_redef_table (

3 UNAME => 'ARUP',

4 ORIG_TABLE => 'ACC_MESG',

5 INT_TABLE => 'ACC_MESG_INT',

6 COL_MAPPING => 'acc_no acc_no, mesg_dt mesg_dt, to_lob(MESG_TEXT) MESG_TEXT'

7 );

8* end;

注意第 6 行,该行已经对列进行了映射。前两列保持不变,但第三列 MESG_TEXT 已被映射,以便通过对源表的列应用函数 TO_LOB 来填充目标表的 MESG_TEXT 列。

如果要重新定义的表很大,则需要定期对源表和目标表之间的数据进行同步。该方法加快了最终同步的速度。

begin
dbms_redefinition.sync_interim_table( 
uname      => 'ARUP',  
orig_table => 'ACC_MESG', 
int_table  => 'ACC_MESG_INT'
);
end;
/

精彩图集

赞助商链接