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

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

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
您能将这两个 MV 连接在一起吗?当然可以,但在 Oracle 数据库 10g 第 2 版之前,查询重写机制只使用两个 MV 中的一个(而非两个)自动重写用户查询。 以下是

您能将这两个 MV 连接在一起吗?当然可以,但在 Oracle 数据库 10g 第 2 版之前,查询重写机制只使用两个 MV 中的一个(而非两个)自动重写用户查询。

以下是 Oracle9i 数据库中的执行计划输出。您可以看到,只使用了 MV_HOTEL_RESV 和 TRANS 的整表扫描。

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=6 Bytes=120)
1    0   SORT (GROUP BY) (Cost=8 Card=6 Bytes=120)
2    1     HASH JOIN (Cost=7 Card=516 Bytes=10320)
3    2       MAT_VIEW REWRITE ACCESS (FULL) OF 'MV_HOTEL_RESV' (MAT_VIEW REWRITE) 
(Cost=3 Card=80 Bytes=1040)
4    2       TABLE ACCESS (FULL) OF 'TRANS' (TABLE) 
(Cost=3 Card=516 Bytes=3612)

即使 MV 可用,该方法也将生成一个非最优的执行计划。唯一的救济就是创建另一个将所有三个表连接在一起的 MV。但该方法将导致 MV 的增多,从而大大增加刷新 MV 所需的时间。

Oracle 数据库 10g 第 2 版解决了此问题。现在,以上查询将重写为使用两个 MV,如执行计划中所示。

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=6 Bytes=120)
1    0   SORT (GROUP BY) (Cost=8 Card=6 Bytes=120)
2    1     HASH JOIN (Cost=7 Card=80 Bytes=1600)
3    2       MAT_VIEW REWRITE ACCESS (FULL) OF 'MV_ACTUAL_SALES' (MAT_VIEW REWRITE) 
(Cost=3 Card=80 Bytes=560)
4    2       MAT_VIEW REWRITE ACCESS (FULL) OF 'MV_HOTEL_RESV' (MAT_VIEW REWRITE) 
(Cost=3 Card=80 Bytes=1040)

注意,该执行计划是如何只使用了 MV 而未使用任何其他基表的。

该增强功能在数据仓库中具有显著的优点,这是因为您不必为每个可能的查询创建和刷新 MV。相反,你可以在关键地方创建几个没有太多连接和聚合的 MV,Oracle 将使用它们来重写查询。

通过备份实现可传输表空间

Oracle8i 中引入的可传输表空间为实现更快的跨数据库数据传输提供了迫切需要的支持。使用此特性,您可以只导出表空间的元数据、传输数据文件并将转储文件导出到目标数据库主机以及导入元数据以将表空间“插入”到目标数据库中。该表空间中的数据在目标数据库中随即可用。该方法解决了数据仓库中曾一度存在的一个很棘手的问题:快速、高效地跨数据库移动数据。

但在 OLTP 数据库中,该条件通常是不可能存在的,因此传输表空间也是不可能的。如果 OLTP 数据库是数据仓库的数据源,则您可能始终无法使用可传输表空间加载它。

在 Oracle 数据库 10g 第 2 版中,可以传输表空间并从另一个数据源(即备份)中插入它。例如,如果要传输表空间 ACCDATA,则可以发出 RMAN 命令

RMAN> transport tablespace accdata 
2> TABLESPACE DESTINATION = '/home/oracle'
3> auxiliary destination = '/home/oracle';

该命令在位置 /home/oracle 中创建一个辅助实例,并从其中的备份恢复文件。此辅助实例的名称是随机生成的。创建实例后,该过程将基于目录创建一个目录对象,并恢复表空间 ACCDATA(我们正在传输的表空间)的文件 - 所有操作均自动完成,您不必发出任何命令!

目录 /home/oracle 将包含表空间 ACCDATA 的所有数据文件、表空间元数据的转储文件以及脚本 impscrpt.sql(最重要的)。该脚本包含将此表空间插入目标表空间所必需的所有命令。该表空间并非由 impdp 命令进行传输,而是通过对 dbms_streams_tablespace_adm.attach_tablespaces 程序包的调用进行传输。可以在该脚本中找到所有必要的命令。

您可能会问,如果出现错误该怎么办?这种情况下,可以轻松地进行诊断。首先,该辅助实例在 $ORACLE_HOME/rdbms/log 中创建警报日志文件,以便您可以检查该日志以查明潜在的问题。其次,在提供 RMAN 命令时,您可以通过发出 RMAN 命令(该命令将所有输出置于文件 tts.log 中)将命令和输出重定向到日志文件。

rman target=/ log=tts.log

然后,您便可以检查该文件来查明故障的确切原因。

最后,将把这些文件恢复到 /home/oracle 的 TSPITR__ 目录中。例如,如果主数据库的 SID 为 ACCT,RMAN 创建的辅助实例的 SID 为 KYED,则目录名为 TSPITR_ACCT_KYED。该目录还包含两个其他子目录:datafile(用于数据文件)和 onlinelog(用于重做日志)。在完成新表空间的创建之前,可以查看该目录以了解恢复了哪些文件。(这些文件在该过程结束时会被删除。)

长期以来,DBA 一直期待着能够通过 RMAN 备份创建一个可传输的表空间。但请注意,您是从备份(而不是从联机表空间)中插入传输的表空间。因此,它将不是最新的。

对已分区的按索引组织的表实现快速的分区分割

考虑这样一种情况:假设您拥有一个已分区的表。月末到了,但您忘了为下一个月定义分区。您现在有哪些选择呢?

您唯一的救济方法就是将最大值分区分割为两个部分:一个用于新月份的分区和一个新的最大值分区。但将该方法用于已分区的按索引组织的表时将遇到一个小问题。这种情况下,将先创建物理分区,并将行从最大值分区移动到该分区,这样将消耗 I/O 和 CPU 周期。

精彩图集

赞助商链接