![Oracle 高水位(HWM High Water Mark) 说明_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/16/51f7d8bf-af90-4369-a575-5bedec9d58f0/51f7d8bf-af90-4369-a575-5bedec9d58f01.gif)
![Oracle 高水位(HWM High Water Mark) 说明_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/16/51f7d8bf-af90-4369-a575-5bedec9d58f0/51f7d8bf-af90-4369-a575-5bedec9d58f02.gif)
![Oracle 高水位(HWM High Water Mark) 说明_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/16/51f7d8bf-af90-4369-a575-5bedec9d58f0/51f7d8bf-af90-4369-a575-5bedec9d58f03.gif)
![Oracle 高水位(HWM High Water Mark) 说明_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/16/51f7d8bf-af90-4369-a575-5bedec9d58f0/51f7d8bf-af90-4369-a575-5bedec9d58f04.gif)
![Oracle 高水位(HWM High Water Mark) 说明_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/16/51f7d8bf-af90-4369-a575-5bedec9d58f0/51f7d8bf-af90-4369-a575-5bedec9d58f05.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一. 准备知识:ORACLE的逻辑存储管理.ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个Block里可以包含多个row. 1.2 区: 由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到Dave,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也
2、就是说再分配多少个区给Dave,而不是多少个块.1.3 段: 是由一系列的区所组成, 一般来说, 当创建一个对象时(表,索引),就会分配一个段给这个对象. 所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE Dave,这个段就是数据段,而CREATE INDEX ON Dave(NAME), ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得.1.4 表空间: 包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.表空间(tableSpa
3、ce) 段(segment) 盘区(extent) 块(block) 关系当我们创建了一个表,即使我没有插入任何一行记录, ORACLE还是给它分配了8个块. 当然这个跟建表语句的INITIAL 参数及MINEXTENTS参数有关. 如:STORAGE(INITIAL 64KMINEXTENTS 1MAXEXTENTS UNLIMITED); 也就是说,在这个对象创建以后,ORACLE至少给它分配一个区,初始大小是64K,一个标准块的大小是8K,刚好是8个BLOCK. Oracle Table 创建参数 说明二. 高水线(High Water Mark)2.1 官网说明如下To manage
4、space, Oracle Database tracks the state of blocks in the segment. The high water mark (HWM) is the point in a segment beyond which data blocks are unformatted and have never been used.MSSM uses free lists to manage segment space. At table creation, no blocks in the segment are formatted. When a sess
5、ion first inserts rows into the table, the database searches the free list for usable blocks. If the database finds no usable blocks, then it preformats a group of blocks, places them on the free list, and begins inserting data into the blocks. In MSSM, a full table scan reads all blocks below the H
6、WM.ASSM does not use free lists and so must manage space differently. When a session first inserts data into a table, the database formats a single bitmap block instead of preformatting a group of blocks as in MSSM. The bitmap tracks the state of blocks in the segment, taking the place of the free l
7、ist. The database uses the bitmap to find free blocks and then formats each block before filling it with data. ASSM spread out inserts among blocks to avoid concurrency issues.Oracle 自动段空间管理(ASSM:auto segment space management)Every data block in an ASSM segment is in one of the following states:(1)A
8、bove the HWMThese blocks are unformatted and have never been used.(2)Below the HWMThese blocks are in one of the following states:(1)Allocated, but currently unformatted and unused(2)Formatted and contain data(3)Formatted and empty because the data was deletedFigure 12-23 depicts an ASSM segment as
9、a horizontal series of blocks. At table creation, the HWM is at the beginning of the segment on the left. Because no data has been inserted yet, all blocks in the segment are unformatted and never used.Figure 12-23 HWM at Table Creation Suppose that a transaction inserts rows into the segment. The d
10、atabase must allocate a group of blocks to hold the rows. The allocated blocks fall below the HWM. The database formats a bitmap block in this group to hold the metadata, but does not preformat the remaining blocks in the group.In Figure 12-24, the blocks below the HWM are allocated, whereas blocks
11、above the HWM are neither allocated or formatted. As inserts occur, the database can write to any block with available space. The low high water mark (low HWM) marks the point below which all blocks are known to be formatted because they either contain data or formerly contained data.Figure 12-24 HW
12、M and Low HWMIn Figure 12-25, the database chooses a block between the HWM and low HWM and writes to it. The database could have just as easily chosen any other block between the HWM and low HWM, or any block below the low HWM that had available space. In Figure 12-25, the blocks to either side of t
13、he newly filled block are unformatted.Figure 12-25 HWM and Low HWM The low HWM is important in a full table scan. Because blocks below the HWM are formatted only when used, some blocks could be unformatted, as in Figure 12-25. For this reason, the database reads the bitmap block to obtain the locati
14、on of the low HWM. The database reads all blocks up to the low HWM because they are known to be formatted, and then carefully reads only the formatted blocks between the low HWM and the HWM.Assume that a new transaction inserts rows into the table, but the bitmap indicates that insufficient free spa
15、ce exists under the HWM. In Figure 12-26, the database advances the HWM to the right, allocating a new group of unformatted blocks.Figure 12-26 Advancing HWM and Low HWMWhen the blocks between the HWM and low HWM are full, the HWM advances to the right and the low HWM advances to the location of the
16、 old HWM. As the database inserts data over time, the HWM continues to advance to the right, with the low HWM always trailing behind it. Unless you manually rebuild, truncate, or shrink the object, the HWM never retreats.Oracle 数据块 Block 说明2. 2 Oracle表段中的高水位线HWM 在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中
17、的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。HWM通常增长的幅度为一次5个数据块.Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数
18、据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需
19、要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。 那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。 在手动段空间管理(
20、Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle 9i Release1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块
21、。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。 2.3. 修正ORACLE表的高水位线在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。rebuild, truncate, shrink,move 等操作会降低高水位。2.3.1 执行表重建指令 alter table table_name move;在线转移表空间ALTER TABLE . MOVE TABLESPACE .当你创建了一个对象如表以后,不管你有没有插入数据,
22、它都会占用一些块,ORACLE也会给它分配必要的空间.同样,用ALTER TABLE MOVE释放自由空间后,还是保留了一些空间给这个表. ALTER TABLE . MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,Move后记住重建索引. 如果以后还要继续向这个表增加数据,没有必要move, 只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间。 2.3.2 执行alter table table_name shrink space; 此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enabl
23、e row movement;2.3.3 重建表复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表2.3.4 用逻辑导入导出: Emp/Imp2.3.5. Alter table table_name deallocate unused DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置. 2.3.6 推荐使用truncate.2.3.7 一些注意事项Oracle 9i:(1)如果是INEXTENT, 可以使alter table tablename deallocate unused将HWM以上所有
24、没使用的空间释放(2) 如果MINEXTENT HWM 则释放MINEXTENTS 以上的空间。如果要释放HWM以上的空间则使用KEEP 0。SQLalter table tablesname deallocate unused keep 0;(3)truncate table drop storage(缺省值)命令可以将MINEXTENT 之上的空间完全释放(交还给操作系统),并且重置HWM。 (4)如果仅是要移动HWM,而不想让表长时间锁住,可以用truncate table reuse storage,仅将HWM重置。(5)ALTER TABLE MOVE会将HWM移动,但在MOVE时需
25、要双倍的表空间,而且如果表上有索引的话,需要重构索引 (6)DELETE表不会重置HWM,也不会释放自由的空间(也就是说DELETE空出来的空间只能给对象本身将来的INSERT/UPDATE使用,不能给其它的对象使用) Oracle 10g:(1)可以使用alter table test_tab shrink space命令来联机移动hwm, (2)如果要同时压缩表的索引,可以发布:alter table test_tab shrink space cascade2.4 HWM 特点2.4.1 ORACLE用HWM来界定一个段中使用的块和未使用的块.举个例子来说,当我们创建一个表时,ORACL
26、E就会为这个对象分配一个段.在这个段中,即使我们未插入任何记录,也至少有一个区被分配,第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储存了一些信息,基中HWM的信息就存储在此.此时,因为第一个区的第一块用于存储段头的一些信息,虽然没有存储任何实际的记录,但也算是被使用,此时HWM是位于第2个块.当我们不断插入数据到表后,第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据,同时,HWM本身也向上移.也就是说,当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块.2.4.
27、2. HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移.ORACLE 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM),2.4.3. HWM的信息存储在段头当中.HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.2.4.4. ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块.所以问题就
28、产生了.当用户发出一个全表扫描时,ORACLE 始终必须从段一直扫描到 HWM,即使它什么也没有发现。该任务延长了全表扫描的时间。2.4.5. 当用直接路径插入行时,即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 数据块直接置于 HWM 之上。它下面的空间就浪费掉了。三. 相关测试1) 创建测试表SQL create table tt (id number);Table created.此时表没有分析,是原始的数据,即8个
29、数据块。SQLSELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 8SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT2) 向表中插入一些测试数据SQL declare 2 i
30、number; 3 begin 4 for i in 1.10000 loop 5 insert into tt values(i); 6 end loop; 7 commit; 8 end; 9 /PL/SQL procedure successfully completed.3)在次查看表的信息SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TTSQL SELECT seg
31、ment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 24此时表TT 占用的数据库已经是24个了。 但是user_tables 显示的信息还是为空。 因为没有做统计分析。 4) 收集统计信息SQL exec DBMS_STATS.GATHER_TABLE_STATS(SYS,TT);PL/SQL procedure successfully completed.SQL SELECT segment_name,segme
32、nt_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 24SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 10000 20 0此时user_tables 已经有了数据,显示的使用了20个数据块。 但是empty_blocks
33、还是为空。 这里要注意的地方。 这个字段只有使用analyze 收集统计信息之后才会有数据。 5) 使用analyze 收集统计信息SQL ANALYZE TABLE TT COMPUTE STATISTICS;Table analyzed.SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 10000 20 3- 这里有显示空的数据库有3个。 注意:20+3=23. 比占用
34、的24个数据块少一个。因为有一个数据库块被保留用作segment header。SQL SELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 246) delete 数据,不会降低高水位SQL delete from tt;10000 rows deleted.SQL commit;Commit complete.SQL SELECT segment_name,segment_type,blocks
35、 FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 24SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 10000 20 3SQL analyze table tt compute statistics;Table analyzed.SQL SELEC
36、T table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 0 20 3SQL SELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 24SQL7) truncate 表,可以降低高水位SQL trunca
37、te table tt;Table truncated.SQL SELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 8SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 0 20
38、 3- 段的信息没有改变,收集一下统计信息看看SQL exec dbms_stats.gather_table_stats(SYS,TT);PL/SQL procedure successfully completed.SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS- - - -TT 0 0 3SQL SELECT segment_name,segment_type,blocks FROM
39、 dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 8-段的信息已经改变,但是empty_blocks 段没有改变,该段只有使用analyze 才能改变。SQL analyze table tt compute statistics;Table analyzed.SQL SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name=TT;TABLE_NAME NUM_ROWS BLOC
40、KS EMPTY_BLOCKS- - - -TT 0 0 7SQL SELECT segment_name,segment_type,blocks FROM dba_segments WHERE segment_name=TT;SEGMENT_NAME SEGMENT_TYPE BLOCKS- - -TT TABLE 8SQL- 总共8个数据块,7个为空,还有一个是segment header。四. Alter table move 和Shrink 区别在下面2篇blog 有说明:alter table move跟shrink space的区别MOS 上的说明,ID:577375.1:The
41、shrink algorithm starts from the bottom of the segment and starts moving those rows to the beginning of the segment. Shrink is a combination of delete/insert pair for every row movement and this generates many UNDO and REDO blocks . Move从segment的底部开始,move这些rows到segment的头部。Shrink则是delete/insert相结合,这样
42、会产生非常多的UNDO和REDO。4.1 Shrink在10g之后,整理碎片消除行迁移的新增功能shrink spaceSQLalter table shrink space | compact | cascade ;compact: 这个参数当系统的负载比较大时可以用,不降低HWM。如果系统负载较低时,直接用alter table table_name shrink space就一步到位了cascade:这个参数是在shrink table的时候自动级联索引,相当于rebulid index。以下SQL 基于普通表shrink必须开启行迁移功能。alter table table_name enable row movement ;保持HWM,相当于把块中数据打结实了alter table table_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度建筑工程质量保修服务合同
- 2025年度专业小时工家政服务合同规范文本
- 2025年度跨境电商共同担保合同范本
- 漯河2024年河南漯河市民政局事业单位引进高层次人才1人笔试历年参考题库附带答案详解
- 昆明云南昆明市五华区人民政府护国街道办事处招聘6名公益性岗位人员笔试历年参考题库附带答案详解
- 2025年中国双格电热锅市场调查研究报告
- 2025年酸性蓝染料项目可行性研究报告
- 2025至2031年中国锦棉闪光锻行业投资前景及策略咨询研究报告
- 2025年美容按摩床项目可行性研究报告
- 2025年盐渍半干海参项目可行性研究报告
- (2024年)房地产销售人员心态培训
- 康复科院感年度工作计划
- T-BJCC 1003-2024 首店、首发活动、首发中心界定标准
- 《海洋自然保护区》课件
- 2024年云南机场集团飞机维修服务分公司招聘笔试参考题库含答案解析
- 外科手术及护理常规
- 苏少版小学一年级下册综合实践活动单元备课
- 学校开学教师安全培训
- 出口潜力分析报告
- 晋升的述职报告
- 微信视频号运营技巧攻略详解全套
评论
0/150
提交评论