知识大全 oracle的高水位线(HWM)
Posted 水位
篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oracle的高水位线(HWM)相关的知识,希望对你有一定的参考价值。
oracle的高水位线(HWM) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
由之前的面试题一中学到的知识
现在解释下什么是 高水位
oracle的逻辑存储结构 表空间——>段——>区——>块
块:是粒度最小的存储单位 现在标准的块大小是 K 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通常增长的幅度为一次 个数据块 原则上HWM只会增大 不会缩小 即使将表中的数据全部删除 HWM还是为原值 由于这个特点 使HWM很象一个水库的历史最高水位 这也就是HWM的原始含义 当然不能说一个水库没水了 就说该水库的历史最高水位为 但是如果我们在表上使用了truncate命令 则该表的HWM会被重新置为
如何知道一个表的HWM?
a) 首先对表进行分析:
ANALYZE TABLE <tablename> ESTIMATE/PUTE STATISTICS;
b) 查看相关信息
SELECT blocks empty_blocks num_rows FROM user_tables WHERE table_name =<tablename>;
[SYS@orcl] SQL>select segment_name segment_type blocks from dba_segments where segment_name= A ;
SEGMENT_NAME SEGMENT_TYPE BLOCKS
A TABLE
可得到A表分配了 个blocks
[TEST @orcl] SQL>analyze table a pute statistics;
表已分析
[TEST @orcl] SQL>select num_rows blocks empty_blocks from user_tables where table_name= A ;
NUM_ROWS BLOCKS EMPTY_BLOCKS
BLOCKS 列代表该表中曾经使用过得数据库块的数目 即水线 EMPTY_BLOCKS 代表分配给该表 但是在水线以上的数据库块 即从来没有使用的数据块
[TEST @orcl] SQL>delete from a;
[TEST @orcl] SQL>analyze table a pute statistics;
表已分析
[TEST @orcl] SQL>select num_rows blocks empty_blocks from user_tables where table_name= A ;
NUM_ROWS BLOCKS EMPTY_BLOCKS
[TEST @orcl] SQL>select count(distinct dbms_rowid rowid_block_number(rowid)||
dbms_rowid rowid_relative_fno(rowid)) used from a;
used
注 Used = 这表名没有任何数据库块容纳数据 即表中无数据
[TEST @orcl] SQL>truncate table a;
表被截断
[TEST @orcl] SQL>analyze table a pute statistics;
表已分析
[TEST @orcl] SQL>select table_name blocks empty_blocks from user_tables where table_name= A ;
TABLE_NAME BLOCKS EMPTY_BLOCKS
A
注意:TRUNCATE命令回收了由delete命令产生的空闲空间 假如表原有 块 使用TRUNCATE后该表分配的空间降为 块 为了保留由delete命令产生的空闲空间 可以使用TRUNCATE TABLE TEST REUSE STORAGE用此命令后 该表还会是原先的 块
HWM的一些特性
oracle用HWM来界定一个段中使用的块和未使用的块
当我们创建一个表:A时 ORACLE就会为这个对象分配一个段 在这个段中 即使我们未插入任何记录 也至少有一个区( bit 也就是 个块)被分配 第一个区的第一个块就称为段头(SEGMENT HEADE) 段头中就储存了一些信息 基中HWM的信息就存储在此 此时 因为第一个区的第一块用于存储段头的一些信息 虽然没有存储任何实际的记录 但也算是被使用 此时HWM是位于第 个块 当我们不断插入数据到A后 第 个块已经放不下后面新插入的数据 此时 ORACLE将高水位之上的块用于存储新增数据 同时 HWM本身也向上移 也就是说 当我们不断插入数据时 HWM会不断上移 这样 在HWM之下的 就表示使用过的块 HWM之上的就表示已分配但从未使用过的块
HWM在插入数据时 当现有空间不足而进行空间的扩展时会向上移 但删除数据时不会往下移
这就好比是水库的水位 当涨水时 水位往上移 当水退出后 最高水位的痕迹还是清淅可见
删除数据后便存在浪费的空间 ORACLE 不会释放空间以供其他对象使用 有一条简单的理由 由于空间是为新插入的行保留的 并且要适应现有行的增长 被占用的最高空间称为最高使用标记 (HWM)
HWM的信息存储在段头当中
HWM本身的信息是储存在段头 在段空间是手工管理方式时 ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配 在段空间是自动管理方式时(ASSM) ORACLE是通过BITMAP来管理段内的空间分配
ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块
当用户发出一个全表扫描时 ORACLE 始终必须从段一直扫描到 HWM 即使它什么也没有发现 该任务延长了全表扫描的时间
采用TRUNCATE语句删除一个表的数据的时候 类似于重新建立了表 不仅把数据都删除了 还把HWM给清空恢复为
当用直接路径插入行时 — 例如 通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 — 数据块直接置于 HWM 之上 它下面的空间就浪费掉了
在手动段空间管理(Manual Segment Space Management)中 段中只有一个HWM 但是在Oracle i Release 才添加的自动段空间管理(Automatic Segment Space Management)中 又有了一个低HWM的概念出来 为什么有了HWM还又有一个低HWM呢 这个是因为自动段空间管理的特性造成的 在手段段空间管理中 当数据插入以后 如果是插入到新的数据块中 数据块就会被自动格式化等待数据访问 而在自动段空间管理中 数据插入到新的数据块以后 数据块并没有被格式化 而是在第一次访问这个数据块的时候才格式化这个块 所以我们又需要一条水位线 用来标示已经被格式化的块 这条水位线就叫做低HWM 一般来说 低HWM肯定是低于等于HWM的
额外扩展
[TEST @orcl] SQL>delete from c;
[TEST @orcl] SQL>alter table c shrink space;
alter table c shrink space
*
第 行出现错误:
ORA : ROW MOVEMENT is not enabled
[TEST @orcl] SQL>alter table c enable row movement;
表已更改
[TEST @orcl] SQL>alter table c shrink space;
表已更改
[TEST @orcl] SQL>analyze table c pute statistics;
[TEST @orcl] SQL>select table_name blocks empty_blocks from user_tables where table_name= C ;
TABLE_NAME BLOCKS EMPTY_BLOCKS
C
修正ORACLE表的高水位线
在ORACLE中 执行对表的删除操作不会降低该表的高水位线 而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块 如果在执行删除操作后不降低高水位线标记 则将导致查询语句的性能低下
下面的方法都可以降低高水位线标记
( ) 执行表重建指令 alter table table_name move;
在线转移表空间ALTER TABLE MOVE TABLESPACE
当你创建了一个对象如表以后 不管你有没有插入数据 它都会占用一些块 ORACLE也会给它分配必要的空间 同样 用ALTER TABLE MOVE释放自由空间后 还是保留了一些空间给这个表
ALTER TABLE MOVE 后面不跟参数也行 不跟参数表还是在原来的表空间 Move后记住重建索引 如果以后还要继续向这个表增加数据 没有必要move 只是释放出来的空间 只能这个表用 其他的表或者segment无法使用该空间
( ) 执行alter table table_name shrink space;
注意 此命令为Oracle g新增功能 再执行该指令之前必须允许行移动 alter table table_name enable row movement;
如果要同时压缩表的索引:ALTER TABLE TEST_TAB SHRINK SPACE CASCADE
( ) 复制要保留的数据到临时表t drop原表 然后rename临时表t为原表
( ) 用逻辑导入导出: Emp/Imp
( ) Alter table table_name deallocate unused
注 这证明 DEALLOCATE UNUSED为释放HWM上面的未使用空间 但是并不会释放HWM下面的自由空间 也不会移动HWM的位置
cha138/Article/program/Oracle/201311/17321相关参考
水电站是将水能转换为电能的综合工程设施。一般包括由挡水、泄水建筑物形成的水库和水电站引水系统、发电厂房、机电设备等。水库的高水位水经引水系统流入厂房推动水轮发电机组发出电能,再经升压变压器、开关站
水电站是将水能转换为电能的综合工程设施。一般包括由挡水、泄水建筑物形成的水库和水电站引水系统、发电厂房、机电设备等。水库的高水位水经引水系统流入厂房推动水轮发电机组发出电能,再经升压变压器、开关站
通过movetablespace来完成resizedatafile HWM的概念就不在此阐述了 测试环境为OraclegforLinux其它版本的一样 我们先创建两个表空间分别为
由于水位计本身散热,水位计内的水温较汽包里的炉水温度低,水位计内水的密度较大,使汽包内的实际水位比水位计指示的水位要高10%一50%。随着锅炉压力的升高,汽包内的炉水温度升高,水位计散热增加,水温
由于水位计本身散热,水位计内的水温较汽包里的炉水温度低,水位计内水的密度较大,使汽包内的实际水位比水位计指示的水位要高10%一50%。随着锅炉压力的升高,汽包内的炉水温度升高,水位计散热增加,水温
锅炉正常运行中调整锅炉水位,保持汽包水位稳定,应做到以下几点: (1)要控制好水位,必须对水位认真监视,原则上以一次水位计为准,以电接点水位计为主要监视表计。要保持就地水位计清晰、准确。若水位计
锅炉正常运行中调整锅炉水位,保持汽包水位稳定,应做到以下几点: (1)要控制好水位,必须对水位认真监视,原则上以一次水位计为准,以电接点水位计为主要监视表计。要保持就地水位计清晰、准确。若水位计
目前电厂高压水位测量中,常用的水位计有()A、双色水位计B、电接点水位计C、差压式水位计D、磁翻板式水位计参考答案:ABC
目前电厂高压水位测量中,常用的水位计有()A、双色水位计B、电接点水位计C、差压式水位计D、磁翻板式水位计参考答案:ABC
水位计汽、水连通管阀门泄漏对水位的影响有两种:一是蒸汽侧泄漏,造成水位偏高;二是水侧泄漏,造成水位偏低。 水位计汽、水连通管和阀门无论汽侧还是水侧堵塞,都使水位升高。掌握水位计的这些特点,在观察