首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:资料 参考手册 服务器
 → 当前位置:首页>linux数据库>oracle>正文

Oracle中压缩数据节省空间和提高速度

OKLinux www.oklinux.cn 2006-12-13 来源:oklinux收集整理 会员收藏 游客收藏

使用表压缩来节省空间并提高查询性能

很多决策支持系统通常都涉及到存储于几个特大表中的大量数据。随着这些系统的发展,对磁盘空间的需求也在快速增长。在当今的环境下,存储着数百TB(太字节)的数据仓库已经变得越来越普遍。

为了帮助处理磁盘容量问题,在Oracle9i第2版中引入了表压缩特性,它可以极大地减少数据库表所需要的磁盘空间数量,并在某些情况下提高查询性能。

在本文中,我将向你说明表压缩是如何工作的,以及在构建和管理数据库时如何配置表空间。我还将基于一些示例测试结构讨论一些性能问题,以帮助你了解使用表压缩预计能获得多大好处。

表压缩是如何工作的

在Orcle9i第2版中,表压缩特性通过删除在数据库表中发现的重复数据值来节省空间。压缩是在数据库的数据块级别上进行的。当确定一个表要被压缩后,数据库便在每一个数据库数据块中保留空间,以便储存在该数据块中的多个位置上出现的数据的单一拷贝。这一被保留的空间被称作符号表(symbol table)。被标识为要进行压缩的数据只存储在该符号表中,而不是在数据库行本身内。当在一个数据库行中出现被标识为要压缩的数据时,该行在该符号表中存储一个指向相关数据的指针,而不是数据本身。节约空间是通过删除表中数据值的冗余拷贝而实现的。

对于用户或应用程序开发人员来说,表压缩的效果是透明的。无论表是否被压缩,开发人员访问表的方式都是相同的,所以当你决定压缩一个表时,不需要修改SQL查询。表压缩的设置通常由数据库管理人员或设计人员进行配置,几乎不需要开发人员或用户参与。

如何创建一个压缩的表

要创建一个压缩的表,可在CREATE TABLE语句中使用COMPRESS关键字。COMPRESS关键字指示Oracle数据库尽可能以压缩的格式存储该表中的行。下面是CREATE TABLE COMPRESS语句的一个实例:

  
  CREATE TABLE SALES_HISTORY_COMP (
  PART_ID    VARCHAR2(50) NOT NULL,
  STORE_ID   VARCHAR2(50) NOT NULL,
  SALE_DATE   DATE NOT NULL,
  QUANTITY   NUMBER(10,2) NOT NULL
  )
  COMPRESS
  ;
 
 

或者,你可以用ALTER TABLE语句来修改已有表的压缩属性,如下所示:

  
  ALTER TABLE SALES_HISTORY_COMP COMPRESS;
  

为了确定是否已经利用COMPRESS对一个表进行了定义,可查询USER_TABLES数据字典视图并查看COMPRESSION列,如下面的例子所示:

  
  SELECT TABLE_NAME, COMPRESSION FROM USER_TABLES;
  
  TABLE_NAME      COMPRESSION
  ------------------  -----------
  SALES_HISTORY    DISABLED
  
  SALES_HISTORY_COMP  ENABLED
 

也可以在表空间级别上定义COMPRESS属性,既可以在生成时利用CREATE TABLESPACE来定义,也可以稍后时间利用ALTER TABLESPACE来定义。与其他存储参数类似,COMPRESS属性也具有一些继承特性。当在一个表空间中创建一个表时,它从该表空间继承COMPRESS属性。为了确定是否已经利用COMPRESS对一个表空间进行了定义,可查询USER_TABLESPACES数据字典视图并查看DEF_TAB_COMPRESSION列,如下面的例子所示:

  
  SELECT TABLESPACE_NAME,
  DEF_TAB_COMPRESSION
  FROM DBA_TABLESPACES;
  
  TABLESPACE_NAME   DEF_TAB_COMPRESSION
  ---------------  -------------------
  DATA_TS_01     DISABLED
  INDEX_TS_01     DISABLED
 
 

正如你所预计的那样,你可以在一个表空间直接压缩或解压缩一个表,而不用考虑表空间级别上的COMPRESS属性。

向一个压缩的表中加载数据

请注意,当你像上面那样指定COMPRESS时,你并没在实际压缩任何数据。上面的这些命令只是修改了一个数据字典的设置。只有你向一个表中加载或插入数据时才会实际压缩数据。

而且,为了确保数据被实际压缩,你需要利用一种正确的方法将数据加载或插入到表中。只有在利用以下4种方法之一批量加载或批量插入过程中才会进行数据压缩:

 

 
  直接路径SQL*Loader
  带有APPEND提示的串行INSERT
  并行INSERT
  CREATE TABLE ... AS SELECT
 
 

如果在一个平面文件中有输入数据是可用的,那么直接路径SQL*Loader方法是将这些输入数据加载至一个表格中最方便的手段。下面给出一个示例:

 

 
  $sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true
 
 

如果在一个登台表中有输入数据,那么你可以使用带有APPEND提示的串行INSERT方法或者并行INSERT方法。

作为一个例子,请看一个名为SALES_HISTORY的未压缩登台表中的可用输入数据。用串行INSERT方法时,你可以使用以下的语句向已压缩表中插入数据:

  
  INSERT /*+ APPEND */
  
  INTO SALES_HISTORY_COMP
  SELECT * FROM SALES_HISTORY;
 
 

或者,你也可以用并行INSERT方法将数据由一个登台表转移到一个已压缩表中,如下所示:

 

 
  ALTER SESSION ENABLE PARALLEL DML;
  
  INSERT /*+PARALLEL(SALES_HISTORY_COMP,4)*/
  INTO SALES_HISTORY_COMP
  SELECT * FROM SALES_HISTORY;
 
上一篇:Oracle非法数据库对象引起错误及解决   下一篇:利用Oracle数据泵完成数据导入和导出

收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·利用Oracle数据泵完成数据导入和导出
·Oracle非法数据库对象引起错误及解决
·Oracle10g调度例行任务解放DBA时间
·你可知道你的Oracle数据库安全吗?
·Oracle中提取和存储数据库对象的DDL
·Oracle的Archive Log模式下的恢复工作
·Oracle数据库的空间使用和管理方法
·Oracle中RMAN和EXP/IMP转移数据实测
·Oracle数据库中所存在默认密码的威胁
·Oracle数据完整性嵌套事务调用的研究
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·如何修改遗失的MySQL的ROO
·教你如何将MySQL数据库的
·详解远程SHELL下安装配置R
·教你在MySQL从口令恢复设
·oracle9i installation on
·Oracle Instant 
·Oracle高级复制(同步复制)
·Linux下Oracle9i RMAN备份
·Linux下的Oracle数据库编
·深入探讨Oracle数据缓冲区
最新文章
·Linux系统下Oracle9i RMAN
·详解远程SHELL下安装配置R
·用Linux系统命令完成Oracl
·Linux下的Oracle数据库编
·Linux下Oracle9i RMAN备份
·SQL Server与Oracle、DB2
·从黑客角度检验Oracle数据
·Oracle PL/SQL语言基础
·裸设备和Oracle问答20例
·Oracle中Decode()函数使用
·oracle中的sql语句
·ORACLE UNDO表空间释放过
·ORACLE FOR LINUX 安装指
·oracle监听不能启动的问题
·Oracle中的Merge函数

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有