资源描述:
《高水位(high water mark)的概念及高水位问题的解决》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、高水位(HighWaterMark)的概念及高水位问题的解决高水位(HighWaterMark)的概念及高水位问题的解决(转)上一篇/下一篇2010-04-0610:36:19/个人分类:OracleDB基础知识查看(212)/评论(0)/评分(0/0)高水位(HighWaterMark)的概念及高水位问题的解决1、准备知识-oracle的逻辑存储结构:表空间——>段——>区——>块块(block):是粒度最小的存储单位,现在标准的块大小是8K,有参数DB_BLOCK_SIZE指定。ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,
2、而不是多少行。SQL>showparameterdb_block_sizeNAMETYPEVALUE------------------------------------db_block_sizeinteger8192区(extent):由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表A时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到A,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给A,而不是多少个块。一个extent包含多少个block是由创建表空间时指定的,类似:e
3、xtentmanagementlocaluniform.size1m。默认情况下一个extent对应8个block,即64k。段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据。表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间。2、高水位(HighWaterMark)的概念:所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为"HighWaterMark"或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segme
4、nt。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。实际环境中随着我们表中数据的不断增长,表的高水位也被不断的推高。当高水位达到一定程度之后,会对该表上的SQL查询效率产生负面影响,因此需要采取有效措施降低高水位。考虑让我们有一个段,如一张表,其中填满了块,如图1所示。在正常操作过程中,删除了一些行,如图2所示。现有就有了许多浪费的空间:(1)在表的上一个末端和现有的块之间,以及(2)在块
5、内部,其中还有一些没有删除的行。图1:分配给该表的块。用灰色正方形表示行。图2:行后面的块已经删除了;HWM仍保持不变。Oracle不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记(HWM),如图2所示。但是,这种方法有两个主要的问题:(1)当用户发出一个全表扫描时,Oracle始终必须从段一直扫描到HWM,即使它什么也没有发现。该任务延长了全表扫描的时间,即降低了sql的性能。(2)当用直接路径插入行时—例如,通过直接加载插入(用APPEND提示插入)或通过SQL*Loader直接路径—数据块直接置
6、于HWM之上,即它下面的空间就浪费了。3、解决HWM的问题:3.1、解决HWM带来的性能问题:我们知道truncatetable会重置HWM,但是truncate会删除所有数据,如果如上面图2所示,表中有大量的碎片该怎么处理呢,我们来模拟这个例子,SQL>createtablespacetestdatafile'/paic/g4cs2021/stg/sx/oradata/ls17xa/test01.dbf'size500mautoextendoffextentmanagementlocaluniform.size1msegmentspacemanagementauto;Tablespa
7、cecreatedSQL>createtabletesthw(namevarchar2(100),idnumber)tablespacetest;TablecreatedSQL>selectsegment_name,header_file,header_block,blocks,bytes,extents,min_extents,max_extents,segment_typefromdba_segmentswheresegment_name=