数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle数据库中利用ASSM改善分段存储


发布日期:2018年07月02日
 
Oracle数据库中利用ASSM改善分段存储

为了保持其最强大和最灵活数据库的地位Oracle在最近发布的几个版本里一直都在创建新的机制来对表格和索引的存储进行简化和分块从Oraclei开始Oracle开始在tablespace内部将对象管理进行自动化第一个增强的地方原来叫做本地管理tablespace(或者简写作LMT)在LMT里Oracle将tablespace里的信息从数据字典的表格空间里移出去而直接将其保存到tablespace自身里这在Oraclei里已经成为了一个事实的标准因为它减轻了数据字典的负担

表格空间的第二个主要增强的是自动分段空间管理(ASSM)它首次出现在Oraclei里有了ASSM链接列表freelist被位图所取代它是一个二进制的数组能够迅速有效地管理存储扩展和剩余区块(free block)因此能够改善分段存储本质

管理空间的两种方法

让我们从比较这两种空间管理开始

本地管理tablespace(LMT)——LMT是通过把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定义句法而实现的和原来由字典管理的tablespace(DMT)不同LMT会将扩展管理自动化并保持Oracle DBA不会被用来指定管理扩展大小的NEXT存储参数这个原则唯一的例外是在NEXT和MINEXTENTS一起用在表格创建的时候

自动区段空间管理(ASSM)——ASSM的tablespace是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定义句法里而实现的通过使用位图freelist取代传统单向的链接列表freelistASSM的tablespace会将freelist的管理自动化并取消为独立的表格和索引指定PCTUSEDFREELISTS和FREELIST GROUPS存储参数的能力

Oracle值得赞扬的地方是这两个空间管理的方法都是可选的特性而且Oracle的老手可能仍会使用更加详细的方法只要他们愿意的话要注意位图区段管理在Oraclei里是可选的而且只能在tablespace这一层实现这一点是十分重要的原有的系统还能够继续使用传统方法来管理freelist

位图freelist挑战传统的空间管理

在我讨论位图freelist和传统的空间管理之前让我们看看位图freelist是如何实现的我会从使用区段空间管理自动参数创建tablespace开始

create tablespace

asm_lmt_ts

datafile

c:\oracle\oradata\diogenes\asm_lmtdbf

size

m

EXTENT MANAGEMENT LOCAL Turn on LMT

SEGMENT SPACE MANAGEMENT AUTO Turn on ASSM

;

一旦你定义好了tablespace那么表格和索引就能够使用各种方法很容易地被移动到新的tablespace里下面就是我进行创建的代码

create table

new_cust

tablespace

assm_lmt_ts

as

select * from customer;

alter index cust_name_idx rebuild tablespace assm_lmt_ts;

要注意当表格或者索引被分配到这个tablespace以后用于独立对象的PCTUSED的值会被忽略而Oraclei会使用位图数组来自动地管理tablespace里表格和索引的freelist对于在LMT的tablespace内部创建的表格和索引而言这个NEXT扩展子句是过时的因为由本地管理的tablespace会管理它们但是INITIAL参数仍然是需要的因为Oracle不可能提前知道初始表格加载的大小对于ASSM而言INITIAL最小的值是三个区块

关于一个万能的方法对于Oracle来说是否是最好的方法还有一些争论在大型数据库里单独的对象设置会带来性能和存储上的巨大不同

PCTFREE的问题

PCTFREE参数是用来指定数据块剩余空间大小的这一空间为将来数据行的扩展而保留如果PCTFREE设置得不得当SQL的更新声明就可能导致大量的数据行碎片和断链

数据行在刚保存的时候还很小而在后来进行了扩展在这种情况下PCTFREE的设置就显得尤其重要了在这样的系统里通常会把PCTFREE设置成等于这就告诉Oracle要为数据行今后的扩展保留%的数据区段空间

PCTUSED的问题

对PCTUSED不正确的设置(例如设得太小了)会导致SQL插入声明性能的急剧下降如果数据区块剩余空间不是很多那么在SQL插入操作的过程中就会产生过量的I/O这是因为被重新使用的Oracle数据区块会被迅速地填满从极端的角度来看没有正确地设置PCTUSED会导致数据区块的剩余空间要比表格数据行的平均长度小在这样的情况下Oracle会五次尝试从freelist链取回区块在五次尝试以后Oracle会提升表格的水位并为插入操作腾出五个新的数据块

有了Oraclei的ASSMPCTUSED就不再控制表格数据块的重新链接阙值了但是你必须依靠Oracle的判断来确定区块在什么时候会有足够的剩余空间放置到freelist里

尽管有了本地管理的tablespace和ASSM之后Oraclei会忽略PCTUSEDFREELISTS和FREELIST GROUPS等参数但是当它们用于表格定义的时候Oracle还是不会给出错误信息

SQL> create table

test_table

(c number)

tablespace

asm_test

pctfree pctused

storage

( freelists next m ) ;

Table created

如果你不记得带有ASSM的本地管理tablespace会略掉任何为PCTUSEDNEXT和FREELISTS所指定的值的话这将是一个十分严重的问题

使用ASSM的一个巨大优势是位图freelist肯定能够减轻缓沖区忙等待(buffer busy wait)的负担这个问题在Oraclei以前的版本里曾是一个严重的问题现在让我们来仔细看看这个特性

在没有多个freelist的时候每个Oracle表格和索引在表格的头部都曾有一个数据块用来管理对象所使用的剩余区块并为任何SQL插入声明所创建的新数据行提供数据块当数据缓沖内的数据块由于被另一个DML事务处理锁定而无法使用的时候缓沖区忙等待就会发生当你需要将多个任务插入到同一个表格里的时候这些任务就被强制等待而同时Oracle会在同时分派剩余的区块一次一个

有了ASSM之后Oracle宣称显着地提高了DML并发操作的性能因为(同一个)位图的不同部分可以被同时使用这样就消除了寻找剩余空间的串行化根据Oracle的测试结果使用位图freelist会消除所有分段头部(对资源)的争夺还能获得超快的并发插入操作(图A)

=) windowopen(/sql/UploadFiles_//jpg); src= if(thiswidth > )thiswidth = ;if(thisheight > ) thisheight = ; border=>

图A Oracle公司对使用位图freelist进行SQL插入操作的测试结果

ASSM的局限性

尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作但是Oraclei的位图分段管理还是有一些局限性的

一旦DBA被分配之后它就无法控制tablespace内部的独立表格和索引的存储行为

大型对象不能够使用ASSM而且必须为包含有LOB数据类型的表格创建分离的tablespace

你不能够使用ASSM创建临时的tablespace这是由排序时临时分段的短暂特性所决定的

只有本地管理的tablespace才能够使用位图分段管理

使用超高容量的DML(例如INSERTUPDATE和DELETE等)的时候可能会出现性能上的问题

上一篇:OracleRAC常用管理命令

下一篇:ORACLE在HP-UX下的系列问题处理(24)