热点推荐
ZOL首页 > 服务器 > 知识学堂 > Oracle > Oracle 11gR1中表压缩增强

Oracle 11gR1中表压缩增强


51cto 【转载】 2009年03月13日 09:55

Oracle 9i开始引入表压缩技术,主要用于数据仓库项目节约存储空间,在11g中它已经成为一个主流特性,在OLTP数据库上的表现也让人非常满意了,除了节约存储空间外,压缩可导致I/O性能增强,减少缓冲区内存占用,使用这些优点是要付出代价的,因为压缩引起CPU开销较大,因此它不是在任何情况下都是有益的。

压缩子句可以在表空间,表或分区一级使用下面的选项指定:

◆NOCOMPRESS - 表或分区不压缩,当没有具体指定压缩子句时这是默认行为。
◆COMPRESS - 这个选项被认为适合于数据仓库系统,只在直接路径插入过程中在表或分区上启用压缩。
◆COMPRESS FOR DIRECT_LOAD OPERATIONS - 这个选项与COMPRESS关键字有同样的影响。
◆COMPRESS FOR ALL OPERATIONS - 这些选项被认为适合于OLTP系统,如名字暗示的那样,这些选项为所有操作启用了压缩,包括普通的DML语句,这个选项需要COMPATIBLE初始化参数设置为11.1.0或更高。

下面的例子展示了在表和分区一级应用多个压缩选项。


-- Table compression.CREATE TABLE test_tab_1 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL, created_date DATE NOT NULL)COMPRESS FOR ALL OPERATIONS;-- Partition-level compression.CREATE TABLE test_tab_2 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL, created_date DATE NOT NULL)PARTITION BY RANGE (created_date) ( PARTITION test_tab_q1 VALUES LESS THAN (TO_DATE('01/01/2008', 'DD/MM/YYYY')) COMPRESS, PARTITION test_tab_q2 VALUES LESS THAN (TO_DATE('01/04/2008', 'DD/MM/YYYY')) COMPRESSFOR DIRECT_LOAD OPERATIONS, PARTITION test_tab_q3 VALUES LESS THAN (TO_DATE('01/07/2008', 'DD/MM/YYYY')) COMPRESSFOR ALL OPERATIONS, PARTITION test_tab_q4 VALUES LESS THAN (MAXVALUE) NOCOMPRESS);

表级压缩设置反映在[dba|all|user]_tables视图中的COMPRESSION和COMPRESS_FOR列。

SELECT table_name, compression, compress_for FROM user_tables;

TABLE_NAME                     COMPRESS COMPRESS_FOR
------------------------------ -------- ------------------
TEST_TAB_1                     ENABLED  FOR ALL OPERATIONS
TEST_TAB_2

2 rows selected.

SQL>

没有使用表级压缩的话这些列将显示NULL值。

分区级压缩设置反映在[DBA|ALL|USER]_TAB_PARTITIONS视图中的COMPRESSION和COMPRESS_FOR列。

SELECT table_name, partition_name, compression, compress_for FROM user_tab_partitions;

TABLE_NAME                     PARTITION_NAME                 COMPRESS COMPRESS_FOR
------------------------------ ------------------------------ -------- ------------------
TEST_TAB_2                     TEST_TAB_Q1                    ENABLED  DIRECT LOAD ONLY
TEST_TAB_2                     TEST_TAB_Q2                    ENABLED  DIRECT LOAD ONLY
TEST_TAB_2                     TEST_TAB_Q3                    ENABLED  FOR ALL OPERATIONS
TEST_TAB_2                     TEST_TAB_Q4                    DISABLED

4 rows selected.

SQL>

可以使用alter table命令修改表和分区的压缩设置,修改对现有的数据没有影响,只对应用到表上的新操作有影响。

ALTER TABLE test_tab_1 NOCOMPRESS;

ALTER TABLE test_tab_2 MODIFY PARTITION test_tab_q4 COMPRESS FOR ALL OPERATIONS;

使用create  tablespace和alter  tablespace命令可以修改表空间级的默认压缩设置,当前的设置显示在DBA_TABLESPACES视图的DEF_TAB_COMPRESSION和COMPRESS_FOR列中。

CREATE TABLESPACE test_ts
DATAFILE '/u01/app/oracle/oradata/DB11G/test_ts01.dbf'
SIZE 1M
DEFAULT COMPRESS FOR ALL OPERATIONS;

SELECT def_tab_compression, compress_for
FROM   dba_tablespaces
WHERE  tablespace_name = 'TEST_TS';

DEF_TAB_ COMPRESS_FOR
-------- ------------------
ENABLED  FOR ALL OPERATIONS

1 row selected.

SQL>

ALTER TABLESPACE test_ts DEFAULT NOCOMPRESS;

SELECT def_tab_compression, compress_for
FROM   dba_tablespaces
WHERE  tablespace_name = 'TEST_TS';

DEF_TAB_ COMPRESS_FOR
-------- ------------------
DISABLED

1 row selected.

SQL>

DROP TABLESPACE test_ts INCLUDING CONTENTS AND DATAFILES;

在多级指定了压缩设置时,总是使用最详细的设置,如:分区设置总是覆盖表设置,表设置总是覆盖表空间设置。
表压缩有关的限制包括:

◆压缩表如果使用了COMPRESS FOR ALL OPERATIONS选项,它只能添加或删除列。
◆压缩表必须有多余255列。
◆压缩不能应用于lob段。
◆表压缩只对堆组织表有效,对索引组织表无效。
◆压缩子句不能应用于哈希分区或哈希-列表分区,相反,它们必须从表空间、表或分区设置中继承它们的压缩设置。
◆表压缩不能指定给扩展表或群集表。

按照我们想要构建ETL过程的步骤,在项目树里涉及到的项目领域是:

◆文件(Files)

◆外部表(External Tables)

◆表(Tables)

◆映射(Mappings)

一旦完成映射的步骤,你就需要下拉到进程流(Process Flows)和调度(Schedules)

在计划浏览器面板的“文件(Files)”项目下创建一个新模块,指定数据源文件的位置,如下图所示:


完成“创建模块”步骤并进入到“导入元数据向导”。这里你如果告诉OWB需要加载的内容是平面文件时,就会启动“平面文件抽样向导”,完成平面文件结构的定义。记住要给日期字段添加日期格式。当指定平面文件并对其抽样后,就可以准备创建关于外部表的元数据了。“平面文件抽样向导”的第一个步骤如下图所示:

当要确定字段分隔符时,你除了可以从下拉表中选择向导所提供的分隔符之外,还可以手动输入其他的分隔符。一旦完成了外部表定义,你就可以马上部署外部表,并在目标架构中创建该表。


给文章打分 5分为满分(共0人参与) 查看排行>>
频道热词:LED照明  工作站  云计算  
视觉焦点
服务器知识学堂热点
排行 文章标题
TOP10周热门服务器排行榜
  • 热门
  • 新品
  • 系列
查看完整榜单>>
下一步,我们就要创建表了。如果要从头开始创建表,就打开“数据对象编辑器”进行表的设计。确保列定义和外部表相应的列定义相匹配。最好首先部署外部表,然后在SQL*Plus中通过CTAS从外部表(只是表定义,并非数据)创建表。

接下来的步骤就是将外部表的内容映射到真实表。创建一个新映射,并如下图所示映射相关列。

部署该映射,如果部署成功的话,这时候你就可以手动运行(开始)从外部表将数据加载到真实表。通过进入“控制中心”可以核实并查看该过程的运行,如下图所示。

如果想要将这个进程流自动化进行,就需要创建一个新的“进程模块”。创建进程流模块、程序包和进程流,然后进入到“进程编辑器”。添加映射操作,执行结果如下图所示:

一旦完成了进程流模式图,我们就可以创建一个新的调度,调度应当是通用的,也就是说不能与任何东西绑定。你必须要回到映射步骤,将映射与调度关联起来。一旦部署了调度,那么就可以将上述的平面文件加载过程自动化了。

总结

虽然本文只是对如何将一个加载过程自动化问题的概述,不过其中涵盖了完成这项任务所需要解决的每一个项目内容。对于一次性文件,甚至对于每天都要导入导出的相同文件或文件集,可能使用shell脚本来编辑这个工作流并通过cron作业来调度显得更加容易些。但从另一方面来讲,一旦设置好整个进程,我们就可以将其部署到开发环境、测试环境,甚至生产环境当中。另外,不要被这个工具名称中的“warehouse”所误导,认为这只适用于数据仓库。如果你需要在一个不同类型的数据库中映射、设计和调度ETL加载过程,OWB也可以相当漂亮地完成任务。