oracle 高水位.doc_第1页
oracle 高水位.doc_第2页
oracle 高水位.doc_第3页
oracle 高水位.doc_第4页
oracle 高水位.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现在解释下什么是“高水位”:oracle的逻辑存储结构:表空间段区块块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行.区:由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表A时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到A,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给A,而不是多少个块. -?不明白,怎么看区?段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE PM_USER,这个段就是数据段,而CREATE INDEX ON PM_USER(NAME),ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得,表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为high water mark或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使 HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了 truncate命令,则该表的HWM会被重新置为0。如何知道一个表的HWM?a) 首先对表进行分析:ANALYZE TABLE ESTIMATE/COMPUTE STATISTICS;b) 查看相关信息:SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name =;SYSorcl SQLselect segment_name,segment_type,blocks from dba_segments where segment_name=A;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -A TABLE 8可得到A表分配了8个blocks。TEST1orcl SQLanalyze table a compute statistics;表已分析。TEST1orcl SQLselect num_rows,blocks,empty_blocks from user_tables where table_name=A;来源:考试大-Oracle认证考试 NUM_ROWS BLOCKS EMPTY_BLOCKS- - -1 5 3BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块.TEST1orcl SQLdelete from a;TEST1orcl SQLanalyze table a compute statistics;表已分析。TEST1orcl SQLselect num_rows,blocks,empty_blocks from user_tables where table_name=A;NUM_ROWS BLOCKS EMPTY_BLOCKS- - -0 5 3TEST1orcl SQLselect count(distinct dbms_rowid.rowid_block_number(rowid)|2 dbms_rowid.rowid_relative_fno(rowid) used from a;used-0 注:Used = 0 这表名没有任何数据库块容纳数据,即表中无数据TEST1orcl SQLtruncate table a;表被截断。TEST1orcl SQLanalyze table a compute statistics;表已分析。TEST1orcl SQLselect table_name,blocks,empty_blocks from user_tables where table_name=A;来源:考试大-Oracle认证考试 TABLE_NAME BLOCKS EMPTY_BLOCKS- - -A 0 8注意:TRUNCATE命令回收了由delete命令产生的空闲空间。假如表原有1024块,使用TRUNCATE后该表分配的空间降为512 块。为了保留由delete命令产生的空闲空间,可以使用TRUNCATE TABLE TEST REUSE STORAGE用此命令后,该表还会是原先的1024块。HWM的一些特性1 oracle用HWM来界定一个段中使用的块和未使用的块。当我们创建一个表:A时,ORACLE就会为这个对象分配一个段.在这个段中,即使我们未插入任何记录,也至少有一个区(64bit,也就是8 个块)被分配,第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储存了一些信息,基中HWM的信息就存储在此.此时,因为第一个区的第一块用于存储段头的一些信息,虽然没有存储任何实际的记录, 但也算是被使用,此时HWM是位于第2个块.当我们不断插入数据到A后,第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据,同时,HWM本身也向上移.也就是说,当我们不断插入数据时,HWM会不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块.2 HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移.这就好比是水库的水位,当涨水时,水位往上移,当水退出后,最高水位的痕迹还是清淅可见.删除数据后便存在浪费的空间,ORACLE 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM)。3 HWM的信息存储在段头当中.HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.4 ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块当用户发出一个全表扫描时,ORACLE 始终必须从段一直扫描到 HWM,即使它什么也没有发现。该任务延长了全表扫描的时间。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。5 当用直接路径插入行时 例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 数据块直接置于 HWM 之上。它下面的空间就浪费掉了在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle 9i Release1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。来源:考试大-Oracle认证考试 额外扩展:TEST1orcl SQLdelete from c;TEST1orcl SQLalter table c shrink space;alter table c shrink space*第 1 行出现错误:ORA-10636: ROW MOVEMENT is not enabledTEST1orcl SQLalter table c enable row movement;表已更改。TEST1orcl SQLalter table c shrink space;表已更改。TEST1orcl SQLanalyze table c compute statistics;TEST1orcl SQLselect table_name,blocks,empty_blocks from user_tables where table_name=C;TABLE_NAME BLOCKS EMPTY_BLOCKS- - -C 1 76. 修正ORACLE表的高水位线在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。(1). 执行表重建指令 alter table table_name move;在线转移表空间ALTER TABLE . MOVE TABLESPACE .当你创建了一个对象如表以后,不管你有没有插入数据,它都会占用一些块,ORACLE也会给它分配必要的空间.同样,用ALTER TABLE MOVE释放自由空间后,还是保留了一些空间给这个表.ALTER TABLE . MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,Move后记住重建索引。如果以后还要继续向这个表增加数据,没有必要move,只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间。(2). 执行alter table table_name shrink space;注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enable row movement;如果要同时压缩表的索引:ALTER

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论