当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 巧妙规划使用Oracle数据空间

MSSQL
SQL Server中删除重复数据的几个方法
SQL Server 基础概念集
SQL Server导入导出
SQL SERVER实用技巧
sql server 常用函数
如何维护SQL Server的“交易日志”
SQL Server数据备份处理过程探讨
JSP中tomcat的SQL Server2000数据库连接池的配置
SQL Server服务器安装剖析
SQL Server 2005数据加密技术应用研究
SQL Server数据库的备份和恢复措施
SQL Server 2005性能测试实践
Jboss下MS SQL Server配置指导
Oracle和SQL Server 追求完美还是讲求实用
SQL Server服务器安装剖析
SQL Server:Oracle与SQL Server事务处理的比较
SQL Server:利用配置文件实现SQL Server与Oralce访问类的转换
SQL Server:测试SQL Server业务规则链接方法
SQL Server :SQL Server 2008高可用性解决方案优劣分析
SQLServer:数据库恢复

MSSQL 中的 巧妙规划使用Oracle数据空间


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 72 ::
收藏到网摘: n/a

Oracle提供了不少方法用于数据空间的使用、监控和维护,同时也在各版本中陆续对这方面的功能进行了增强,目的在于简化这方面工作的复杂度,提高应用的运行效率。

一、相关概念

数据库的空间在逻辑上分为多个表空间,每个表空间则由系统中的一个或多个物理数据文件构成;Oracle存储数据的基本单位是块,其大小在建库时由DB_BLOCK_SIZE参数确定,一个或多个连续的块构成一个区片(EXTENT),它作为数据对象存储的基本单位来使用。在Oracle中,每个基本数据对象使用的空间称为段(Segment),段存放在唯一的表空间上,每个段实际上是一系列区片(更为准确地是数据块)的集合。每个简单数据对象对应一个段;对于分区对象如分区表、索引,则每个(子)分区对应一个段,由各个(子)分区共同构成一个完整的数据对象。因此,可以把表空间看作桶,里面放着许多段;一个段只能放在一个桶中,而不能跨越多个桶。

二、表空间的使用

表空间碎片的产生

由于同一个表空间中存放有多个数据段,各个数据段可以有不同的区片尺寸,不同段的区片可以交叉存放;当这些段中的区片经过分配(如创建表)、释放(如删除表)后,就可能使表空间中原本连续的空闲数据块变成不连续,而区片必须由连续的数据块构成,这时,当某一段需要分配新的区片时,就有可能出现虽然表空间空闲数据块的总和大于所需区片的大小,但却无法找到一串连续的块来供此区片分配使用。这种情况就称为表空间的Extent Fragmentation。我们经常会遇到这种情况,明明从DBA_FREE_SPACE中计算表空间还有几百MB,但其中的某一个表却无法再扩展几个MB的空间。

消除表空间碎片

Oracle在段的区片分配上为用户提供了很大的灵活性,然而如果未能正确使用创建表空间和数据对象的各个可选择参数,则在最后将不可避免的要面对区片碎片的问题。Oracle 的Bhaskar Himatsingka 和 Juan Loaiza,为此提出了SAFE(Simple Algorithm for Fragmentation Elimination.)配制规则,通过遵循这套规则,区片级碎片可以完全的避免。而实际上,Oracle8i引入的新特性:Local Managed Tablespace就是SAFE规则在Oracle Server的内置实现。SAFE原则概括起来包括:

1. 对每个表空间上的段使用相同的区片尺寸;段参数INITIAL=NEXT,PCTINCREASE=0;可以通过使用Create Tablespace 的‘ MINIMUM EXTENT’ 子句来确保分配的区片是此参数的倍数;

2. 仅在表空间级指定INITIAL、NEXT参数,在创建数据段时不要指定这些参数;

3. 区片的大小根据段大小来确定,原则是均衡顺序扫描的效率和空间的利用率,同时确保段的区片数目控制在1024之下;根据此原则,在进行相应测试之后,确定区片选取规则;

有此数据库中可以只使用三种区片大小的表空间;在对象创建之前需对其大小进行评估,并放到相应的表空间中;

4. Oracle815引入了本地管理表空间,它在管理和性能上都优于传统的字典管理表空间,它已融合了规则1、2、3 ;要使用此特性,在CREATE TABLESPACE语句中指定EXTENT MANAGEMENT LOCAL子句;

5. 段的区片数目上限应在4096之下,DML操作在此区片数目范围内不会有明显的性能差异;但某些DDL操作的速度则与区片的数目关系较大;因此合理的区片数目应保持在1024之下;对于持续不断扩展的段,应监控区片数目,在必要时移至其它表空间;

6. 对于特别大的数据段应控制在4G-128G(Oracle7为5G-160G)之间,它们应存放到单独的表空间上,同时对于这些特大段应考虑使用分区拉提高性能;

7. 用户的临时表空间应使用TEMPORARY类型;

8. 当系统的事务规模比较均衡时可以对回滚段使用OPTIMAL参数,否则应避免制定OPTIMAL参数,而定期监控回滚段的大小,并在必要时重建;

9. 临时段和回滚段绝对不要将用户数据存放到SYSTEM表空间,它是专为永远不会Drop和Truncate的系统数据对象而设计的;

10. 创建表空间时指定数据文件的大小应=区片整数倍+1数据块,对于Local Managed Tablespace则为区片整数倍+64K;

11. 当表空间使用统一的区片大小时,不要对其进行空间整理,重整的结果不仅耗费精力而且可能会使性能变差;对于未使用统一的区片尺寸的表空间应通过Export/Import重整;

12. 8i 提供了Alter Table …Move [Tablespace…]命令可用于快速重整表,Alter Index …Rebuild…[Tablespace…] 命令可用于快速重建索引。

有关使用单个区片的误导

在许多关于碎片整理的文档中建议在Export时使用Compress=Y选项,将表中的所有数据调整到一个区片中,期望在Import后获得良好性能。由此让许多人产生一个观点,认为当表中数据全部存放到一个区片中时,可以获得良好性能。实际上单区片段只在以下条件成立时,才具有优越性。

数据主要以(全段)扫描方式访问;

段所对应的数据块在物理磁盘上连续存放,Oracle可以发布较大的顺序磁盘读操作;

通过对这两条进行分析可以发现,一方面数据库中大部分表是通过索引来访问,另一方面现在的数据库文件一般在物理上使用了RAID5或RAID0+1技术,数据以条带化方式分布到多个物理磁盘上,逻辑上的单个区片和多区片在物理上并无本质上的区别;另外,从Oracle的角度来看,管理几百个区片的段是非常轻松的并不会有性能的下降。由此可见将整个段放到一个区片中并无明显好处,而这种做法却会导致表空间碎片的产生。

三、表数据段的使用

表空间的组织

Heap表的空间由一系列区片链接而成,每个数据块除块头外其余部分可用于存放数据,在创建表时可以指定以下参数:

PCTFREE:块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能再插入到此块中;

PCTUSED:指定块中数据使用空间的最低百分比;当一个块在达到PCTFREE,之后经历了一些DELETE操作,在其空间使用下降到PCTUSED后便可以重新被用于INSERT数据;这就是PCTFREE/PCTUSED参数的含义;

调整PCTFREE、PCTUSED参数的目标一方面是提高性能,另一方面则主要是提高空间使用效率,避免出现块中存在有许多未用的空间,但却无法找到一个块可以被用于插入新数据行的情况发生。

PCTFREE的使用

在Oracle中表的每一行数据由唯一的ROWID标记;而Oracle支持的数据类型中有一些长度是可变的,如VARCHAR,当对这些数据进行UPDATE时,如果块中的可用空间不能容纳UPDATE后的数据行时,Oracle将会把此行移到其它数据块,同时保留此数据行的ROWID不变,并在原有块中建一指针指向行迁移后的位置。在这种情况下读取一行数据将需要访问2个数据块,从而导致性能下降。PCTFREE保留的空间就是为确保更改后的数据行可以仍存放于原有数据块中,避免行迁移的情况发生。

由此,如果PCTFREE设置不足时可能产生行迁移;而另一方面如果PCTFREE设置过高,将会造成空间浪费。因此正确设置PCTFREE需要对表中数据的使用进行分析。对于数据长度不会变化或极少更新的情况,可以采用较小的PCTFREE;对于其它大多数情况应采用稍大的PCTFREE(PCTFREE的缺省值是10,如果不好估计需预留的空间,可以使用15-25的范围),不要为节约块中的空间而使用较小的PCTFREE值。