Oracle-高水位(HWM_-High-Water-Mark)-说明

合集下载

ORACLE高水位(HWM)是什么意思

ORACLE高水位(HWM)是什么意思

ORACLE⾼⽔位(HWM)是什么意思在Oracle数据的存储中,可以把存储空间想象为⼀个⽔库,数据想象为⽔库中的⽔。

⽔库中的⽔的位置有⼀条线叫做⽔位线,在Oracle中,这条线被称为⾼⽔位线(High-warter mark, HWM)。

在数据库表刚建⽴的时候,由于没有任何数据,所以这个时候⽔位线是空的,也就是说HWM为最低值。

当插⼊了数据以后,⾼⽔位线就会上涨,但是这⾥也有⼀个特性,就是如果你采⽤delete语句删除数据的话,数据虽然被删除了,但是⾼⽔位线却没有降低,还是你刚才删除数据以前那么⾼的⽔位。

也就是说,这条⾼⽔位线在⽇常的增删操作中只会上涨,不会下跌。

也就是说,⾼⽔位线不会因为 DELETE 操作⽽降低。

⾼⽔位并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。

delete数据是没⽤的,即使数据删除了,⾼⽔位的值也不会下降。

释放表的⾼⽔位通常有如下⼏种办法:(1)对表进⾏MOVE操作:ALTER TABLE TABLE_NAME MOVE;。

若表上存在索引,则记得重建索引。

(2)对表进⾏SHRINK SPACE操作:ALTER TABLE TABLE_NAME SHRINK SPACE;,注意,在执⾏该指令之前必须开启⾏移动:ALTER TABLE TABLE_NAME ENABLE ROW MOVEMENT;。

该⽅法的优点是:在碎⽚整理结束后,表上相关的索引仍然有效,缺点是会产⽣⼤量的UNDO和REDO。

(3)复制要保留的数据到临时表T,DROP原表,然后RENAME临时表T为原表。

(4)exp/imp或expdp/impdp重构表。

(5)若表中没有数据则直接使⽤TRUNCATE来释放⾼⽔位。

如何看懂ORACLE执行计划

如何看懂ORACLE执行计划

如何看懂ORACLE执⾏计划如何看懂执⾏计划⼀、什么是执⾏计划An explain plan is a representation of the access path that is taken when a query is executed within Oracle.⼆、如何访问数据At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:Full Table Scan (FTS) --全表扫描Index Lookup (unique & non-unique) --索引扫描(唯⼀和⾮唯⼀)Rowid --物理⾏id三、执⾏计划层次关系When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --采⽤最右最上最先执⾏的原则看层次关系,在同⼀级如果某个动作没有⼦ID就最先执⾏1.⼀个简单的例⼦:SQL> select /*+parallel (e 4)*/ * from emp e;Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=7134)1 0 TABLE ACCESS* (FULL) OF 'EMP' (Cost=1 Card=82 Bytes=7134):Q5000--[:Q5000]表⽰是并⾏⽅式1 PARALLEL_TO_SERIAL SELECT /*+ NO_EXPAND ROWID(A1) */ A1."EMPNO",A1."ENAME",A1."JOB",A1."MGR",A1."HI优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采⽤CBO还是RBO:SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采⽤CBOSELECT STATEMENT [CHOOSE] --Cost为空,采⽤RBO(9I是如此显⽰的)2.层次的⽗⼦关系的例⼦:PARENT1**FIRST CHILD****FIRST GRANDCHILD**SECOND CHILDHere the same principles apply, the FIRST GRANDCHILD is the initial operation then the FIRST CHILD followed by the SECOND CHILD and finally the PARENT collates the output.四、例⼦解说Execution Plan----------------------------------------------------------0 **SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)1 0 **HASH JOIN (Cost=3 Card=8 Bytes=248)2 1 ****TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=36)3 1 ****TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=16 Bytes=304)左侧的两排数据,前⾯的是序列号ID,后⾯的是对应的PID(⽗ID)。

oracle数据库高水位线问题处理

oracle数据库高水位线问题处理

oracle数据库⾼⽔位线问题处理⼀、什么是⾼⽔线(High Water Mark)?Oracle 数据库在创建⼀张表时,会为这张表分配⼀个段空间(segment),为了⽅便理解,把段空间容纳数据的上限,称之为⾼⽔位线(HIGH WATER MARK) HWM ,HWM是⼀个标记,⽤来说明表⽰有多少未使⽤的块分配给这个段。

两个结论:1.⽔位线以上表⽰已经分配但还未使⽤块(block),⽔位先以下爱表⽰已经分配且已经使⽤过的块(包含了正在使⽤的块和使⽤过的且被删除了数据的空块)2.理论上来说,⼀张表的⽔位线只会增⼤不会减⼩(除⾮通过特殊的⽅法重置),即使将表中的数据全部删除,HWM还是为原值。

⼆、HWM数据库的操作有如下影响:a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键⼊在插⼊数据时使⽤了append关键字,HWM也会不断增⼤,占⽤系统资源,表所占的实际空间会不断增⼤,导致系统出现问题三、⾼⽔位线原因以及解决⽅法:产⽣原因:1.操作表时使⽤删除了⼤量数据。

2.在插⼊时使⽤了/append nologging/语句,append关键字会从为表分配段中的随机位置插⼊,⽔位线会不断增⾼。

3.Sql load 时默认使⽤truncate ⾃带了reuse storage参数,导致truncate以后⽔位线不会降低。

解决⽅法:1.直接truncate table drop storage2.建⽴⼀张维护表定期move并重建索引或者shrink space。

3.表数据落表时按照⽇期建⽴了备份表,保留⼀定天数数据4.Rename表名,重建表,重建索引,将数据导⼊重建表,drop原表,然后rename重建表为原表5.使⽤alter table 表名 shrink space(oracle10新增功能)6.在线表重定义(功能强⼤,操作复杂,⼀般不使⽤,可以改变表的结构)表重建的两个⽅法move与shrink的对⽐:move是oracle8出现的命令,使⽤时会创建⼀块和原来表空间相同⼤⼩的另⼀块表空间,然后进⾏数据的复制,完成后使⽤后表替换原表,解决hwm的问题。

oracle_move高水位原理_理论说明

oracle_move高水位原理_理论说明

oracle move高水位原理理论说明1. 引言1.1 概述本文将对Oracle数据库中的MOVE高水位原理进行深入探讨和分析。

在Oracle 数据库中,高水位是一个重要的概念,它代表了已经被使用过的数据块的最高位置。

MOVE操作是一种常用的数据库维护操作,在进行数据迁移、空间释放等操作时经常会使用到。

然而,MOVE操作对高水位有着直接而重要的影响,并且也会对数据库性能产生一定程度的影响。

1.2 文章结构本文共分为5个部分:引言、Oracle MOVE高水位原理、理论说明、实例演示与案例分析以及结论与展望。

在引言部分,我们将简要介绍文章所要讨论的主题,并概括出文章的结构和目标。

在后续各个章节中,我们将依次深入剖析了解Oracle数据库中MOVE操作与高水位之间的关系,并通过实例演示和案例分析来验证其效果。

1.3 目的本文旨在提供读者对Oracle MOVE高水位原理有全面且清晰的理解。

通过详细解释MOVE操作对高水位的影响以及数据块迁移原理等方面内容,帮助读者更好地掌握和应用这些知识。

此外,本文还将通过实例演示和案例分析,探讨MOVE操作的效果评估和优化策略,并对问题解决方案进行提供。

最后,在结论部分,我们将总结整篇文章的主要观点,并展望未来研究方向,以期为读者提供一个全面而深入的学习参考。

2. Oracle MOVE高水位原理:2.1 高水位概念解析:在Oracle数据库中,每个表都有一个高水位(High Water Mark)。

高水位是指在数据块中已被使用的最高位置,也可以理解为表的逻辑尾部。

所有数据的插入和更新操作都必须在高水位之下进行,否则将超越当前的高水位。

2.2 高水位产生与作用:当向表中插入新记录时,数据库会根据需要动态增加数据块以容纳新数据。

这些新的数据块直到达到当前高水位才能被利用。

因此,高水位的存在主要是为了管理和优化数据块的使用情况。

通过控制表的高水位,可以减少碎片化并提升存储空间的利用率。

水位线

水位线
就叫做低 HWM。一般来说,低HWM肯定是低于等于HWM的。
用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是
说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
下面我们来谈一下Orac进行一次扫描,但是究竟扫描多少数据存储块呢,
Oracle表段中的高水位线HWM
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,
在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个
时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采
描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这
个时候其实奥秘就是这里的高水位线了。
那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删
除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有
这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一
下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需
要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插

逻辑存储结构-段区块

逻辑存储结构-段区块

数据库逻辑存储结构数据库的物理存储结构对应一系列的物理文件,这部分主要描述的是数据存储的实际位置,不过数据如果存储,是以什么结构存储到数据文件中,则取决于数据库的逻辑存储结构.Oracle数据库在执行操作时,并不是以数据文件为单位,而是从逻辑上定义出一组结构,操作的数据可以一步步细分不同的存储单元,oracle 操作数据的过程,实际上就是对这些不同级别的存储单元进行维护和管理的过程.--数据库的存储结构分为:段(segment).区(extent)和数据块(block)段(segment):段是数据库内占用空间的对象.它们使用数据库中数据文件内的空间.一个tablespace对应多个segment,一个segment只能对应一个tablespace,但可以跨越对应tablespace下的datafiles--段类型:●表(table):是数据库中最重要的段,也是数据库内存储数据的最常用方法.表段用于存储非集簇且未分区的表中的数据.表段中的所有数据都必需存储在一个表空间内.●表分区(table partition):当一个表的规模很大,且并发操作非常频繁时,可以把这样表划分成若干个分区(partition).而每个分区驻留在不同的表空间.每个分区的存储参数都可以单独定义.可以通过把每个分区放在不同磁盘上以提高并行操作的能力,从而达到改进系统效率的目的.对于分区表,当一个分区损坏了并不影响其他分区的操作.提示:要使用分区表,必需使用oracle的企业版分区表的选项(partitioning),oracle提供了大批专门命令来管理和操作分区表.●簇(cluster):簇与表一样,是一种数据段类型.簇内的行是基于键列值存储的.一个簇可以包含一个或多个表.一个簇的表属于同一个段并且共享相同的存储特性.可以通过索引或者三列算法来访问集簇表内的行.提示:簇少用,这样可以减少管理和维护的负担,也可以使跨IT平台的移植变的更加容易.●索引(index):索引段的目的是加快基于某一特殊(索引关键字)的查询速度,这样查询可以很快查找到某一个表中所需数据的准确位置.一个特定索引的所有索引记录都记录在一个索引段中.如在吗果一个表有三个索引,那么就会有三个对应的索引段,SQL> conn erm/ermConnected.SQL> select * from tab;no rows selectedSQL> select segment_name,segment_type from user_segments; <==使用user_segments视图查看段类型(segment_type) no rows selectedSQL> create table t (id int primary key,name char(10)); <== 此表里有一个主键,建立主键自动创建索引.Table created.SQL> select segment_name,segment_type from user_segments;SEGMENT_NAME SEGMENT_TYPE------------------------------ ---------------SYS_C005144 INDEX <==t表主键的索引段T TABLE●索引分区(index partition):当在一个大型或超大型表上创建索引时,那这个索引也可能很大,所以也可以像分区表一样,将该索引划分为若干个分区,每个索引分区为一单独的段.这样一个索引可以分布在不同的表空间上.但每个索引分区(段)只能存放在一个表空间中.●索引表(index-organized table):如果用户的查询主要是基于索引关键字,那么在索引树的叶子节点中的数据行的地址部分可以存放真正的数据,这种存储结构称为索引表.索引表优点:可以大大的加快基于索引关键字的查询索引表缺点:索引表这种存储结构不适合DML(数据操纵语句)操作非常频分的表DML语言不隐含commit语句的,因此需要用户手动提交对数据库的修改.●临时段(temporary segment):当在SQL语句中使用了诸如ORDER BY,GROUP BY或DISTINCT等语句或关键字时,oracle就要试着在内存中进行排序,如果内存中排不下就把中间的结果写到磁盘上,该磁盘区就是临时段.●还原段(undo segment):还原段9i之前称为回滚段(rollback segment),用来存放事务(transaction)对数据库所做的改变.oracle涉及到一致性读操作.也就是当一个用户对一个表进行修改,而这时另一个用户对表做DML操作时,对任何数据块或索引块改变之前,所有的原始值都将存放到还原段中.这样做不但允许用户可以还原所做的变化,而且还可以在另一个用户对数据进行DML操作的同时,允许对该行数据进行读操作(读的是存放到还原段的原来的数据)●大对象段(LOB segment):大对象(LOB)数据类型是从8i开始引入的,用户存储例如大的正文文档,图像或音像信息的.在一个表中可以有一列或多列LOB数据类型.如果LOB类型的列很大.oracle就会将该列的值单独存放在另一个段中,该段就称为大对象段,在表中只包含一个指向相应大对象数据的指针(地址)●嵌套表(nested table):嵌套表是一种特殊表,该表中某一列又由一个用户定义的表组成,即表中套表,被称为嵌套表的内表呗存放在另外一个段中嵌套表少用●自举段(bootstrap segment):是在数据库被创建时由sql.bsq脚本创建,也被称作为高速缓存段.自举段DBA无法查询或修改,并且不需要dba维护.--存储子句优先级:●段级别定义了存储参数,将大于表空间定义的存储参数,但表空间一级的参数MINIMUM EXTENT或UNIFORM SIZ除外.●当段没有显示的定义存储参数,将默认为表空间一级做定义的参数●当表空间一级没有显示的定义存储参数,则使用oracle系统默认的存储参数注意事项:●如果指定了表空间的最小区(minimum extent)大小,则该大小适用于将来分配给该表空间内段的所有区.某些参数不能在表空间一级定义,而只能在段级别定义●如果对存储参数进行了修改,新的存储参数只适用于还没有分配的区--区的管理区是表空间内某个段使用的一块空间,它是由连续的oracle数据块组成.引入区的目的:为了提高系统的效率,利用区来进行磁盘空间分配可以大大的减少磁盘分配的次数.oralce的磁盘分配算法是一个递归算法.而递归算法效率本身就比较低,减少磁盘分配的次数,也就等于减少了该递归发`算法使用的次数.当段处于以下情况时分配区●当一个段被创建时(created)时●当一个段被扩展(extended)时●当一个段被改变时(altered)时当段处于以下情况时回收区●当一个段被删除(dropped)时●当一个段被改变时●当一个段被截断(truncated)时<==删除表数据,并且释放数据块空间创建表空间时,在该表空间中的数据文件就包含了一个文件头,这个头就是该数据文件的第一个或前几个数据块.段所使用的的连续磁盘空间被称作使用区(used extent)未使用的称作空闲区(free extent),当一些段释放了磁盘空间时,这些释放的区段就被添加到所在表空间中可以使用的空闲区中.--数据库块:oracle最小的存储单位就是数据库块,也称作oracle数据库块.oracle数据块是由一个或多个操作系统块组成,其大小在表空间创建时,设置DB_BLOCK_SZIE为默认oracle数据块的大小.可以使用命令在操作系统级别查看数据库参数文件里默认的db_block_size值或是从数据库里使用dba_tablespaces视图来查看当前数据块大小[oracle@fs11 ~]$ strings $ORACLE_HOME/dbs/spfilemfs.ora |grep -i db_block <==grep –i -i参数表示不区分大小写*.db_block_size=8192 或SQL> show parameter db_block_size <==在数据库里查看参数NAME TYPE VALUE------------------------------------ ----------- ------------------------------ 或db_block_size integer 8192SQL> select TABLESPACE_NAME,BLOCK_SIZE from dba_tablespaces; 在数据库里使用dba_tablespaces视图--数据块大小在8i前的版本中,oracle只能有一种数据块,其大小由DB_BLOCK_SIZE设定,9i版本开始,支持多种数据块大小,9i开始oracle数据库可使用一个标准数据块和4个非标准数据块.--标准数据块标准数据块的大小被用于系统表空间和临时表空间.数据库中标准数据块的大小是在数据库创建时,由初始化参数DB_BLOCK_SIZE设置,如果要修改标准块大小,只能重建数据库提示:除非有特别的说明,一般将最常用的数据块大小选为标准数据块大小,而且标准块大小还用作表空间默认块大小.如果没有说明,默认数据块的大小是是与操作系统相关的,在一般情况下这个默认值最合适.非标准数据块的大小为2的次方,其值在2-32kb之间,即2,4,8,16,32提示:虽然非标准块为2,4,8,16,32 共五种,但一般32位的windows或linux操作系统上oracle数据块使用的是8,所以在32位系统中,非标准DB_CACHE_SIZE参数用来执行标准块大小缓冲区的高速缓冲区大小,它的最小值为一个granule(颗粒)(4MB or 16MB) 默认值为48MB.该高速缓存的数据块大小为标准块大小,由DB_BLOCK_SIZE所定义.8i之前版本中的DB_BLOCK_BUFFERS初始化参数已被DB_CHCHE_SIZE初始化参数所取代.提示:granule是一个连续虚拟内存分配单位,granule的大小取决于估算的SGA的总大小,这个总大小是根据SGA_MAX_SIZE的参数值计算的,如果估算的SGA的大小<128MB,则为4MB;否则为16MB.--非标准块大小使用以下动态参数配置附加高速缓存◆DB_2K_CACHE_SIZE 用于 2 KB blocks◆DB_4K_CACHE_SIZE 用于 4 KB blocks◆DB_8K_CACHE_SIZE 用于 8 KB blocks◆DB_16K_CACHE_SIZE 用于 16 KB blocks◆DB_32K_CACHE_SIZE 用于 32 KB blocks提示:数据块大小还受到IT平台的一些限制,如果使用的IT平台上最小块为2KB,那么就不能设置DB_2K_CACHE_SIZE;以此类推,IT平台设置了2,4,8,16,32,其中任意一个,那DB_nK_CACHE_SIZE就不能设置相同的值. DB_nK_CACHE_SIZ默认值为0--多种数据块大小的规则●一个分区对象的所有分区(partition)必需存在相同块大小的表空间中●所有临时表空间,包括被用作默认临时表空间的的永久表空间都必需是标准块大小●索引表的overflow(溢出)和外部LOB段可以存储在块大小与基表不同的表空间中.--创建非标准块大小的表空间通过在CRTATE TABLESPACE语句中使用BLOCKSIZE nK或BLOCKSIZE n子句来创建非标准块大小的表空间,n为整数,单位为字节,如果使用后缀为K,单位为KB.为了使用这一语句,必须首先设置DB_CACHE_SIZE和至少一个DB_nK_CACHE_SIZE参数,而且该子句中的正整数也必须与所对应的DB_nK_CACHE_SIZE参数中的正整数n相同.如果没有设置或不匹配会在创建非标准块表空间时报错SQL> show parameter db_block_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192SQL> show parameter db_16NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0SQL> create tablespace tbs2 datafile3 '/u01/app/oracle/oradata/mfs/tbs_01.dbf'4 size 10m blocksize 16k;create tablespace tbs*ERROR at line 1: 第 1 行出现错误:ORA-29339: tablespace block size 16384 does not match configured block sizesORA-29339: 表空间块大小 16384 与配置的块大小不匹配提示:能不创建非标准块就不创建,因为使用非标准块大小的表空间会增加内存的开销.--创建非标准块步骤:SQL> show parameter db_block_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192SQL> show parameter db_16 <==查看db_nk_cache_size其中一个值NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0SQL> alter system set db_16k_cache_size=4M; <==设置SQL> create tablespace tbs datafile '/u01/app/oracle/oradata/mfs/tbs_01.dbf' size 10m blocksize 16k;SQL> select tablespace_name,block_size,contents from dba_tablespaces;TABLESPACE_NAME BLOCK_SIZE CONTENTS------------------------------ ---------- ---------SYSTEM 8192 PERMANENTUNDOTBS1 8192 UNDO……USERS 8192 PERMANENTTBS 16384 PERMANENT <==创建的非标准块表空间的块大小--数据块结构●数据块头:包含块的一些属性信息,如块的物理位置,块所属的段的类型(如数据段,索引段,回滚段等)和事务槽.事务槽是在事务修改数据块中的数据行时使用的,头部从上往下增长●表目录:块中存储的数据为表数据,表目录中保存关于这个表的相关信息●行目录:块中存储的数据为表数据,表目录中保存数据行的相关信息提示:一个块中可能包含多条表记录,也可能只保存某条记录的一部分,这要视记录的长度及该块的空间分配情况而定.数据块头,表目录和行目录组成了块的头部信息,这部分并不存储数据库中的实际数据,而是用来记录该块的逻辑结构,而且这部分占用的空间并不是固定的,平均大概占用84-107个字节的空间.是从上往下增加●行记录(数据空间/已用空间):数据块中已被写入数据的区域,当数据被删除时,这部分空间会被转换成空闲空间.提示:行记录/行数据是从下往上插入到块中●空闲空间:当前块的可用空间,是块中尚未使用的存储空间.当对现有数据进行update或insert新数据到块中时,就是从这部分空间分配容量用来写入数据.如果执行update操作时,块中的空间已经不足以存储修改的数据,那么记录就将被保存到另外一个拥有足够空间的块中,而只在原块保留一条指向新块的rowid,这种现象就是行迁移(row migration)提示:数据块存储的数据不影响块的内部机构.不管块中存储的是什么数据类型,块的内部结构都是相同的.提示:最初,块内的空闲空间是连续的,但是,删除和更新会使块内的空闲空间产生碎片.oracle服务器可以在需要时合并块内的空闲空间.--数据块的空间管理●手动管理●自动管理(ASSM automatic segment space management)为了更有效的管理和控制oracle数据块的各个部分,oracle引入了4个参数这个四个参数可以用来控制数据块段的空间使用,也可以控制索引段中的空间.它们又被分为控制并行操作的参数和控制数据空间使用的参数两类控制并行操作的参数:INITRANS和MAXTRANS在了解这两个参数前,先了解下数据块中与事务有关的数据行和块头的结构在数据块中每一数据行的头部有一个锁位,该锁位只记录了该行在事务中所使用的事务槽号,而事务槽是在数据块头中,有关事务的控制信息都放在了事务槽中.oracle是通过每一行的锁位中事务槽号在数据块头中找到所对应的事务槽,并利用该槽中的信息来完成该数据行的事务控制.事务槽是用来存储与当前改变数据块的事务有关的信息.每一个事务只使用一个事务槽,即使这个事务正在修改行数据或多行索引记录.●INITRANS;定了创建数据块或索引块时事务槽的初始值.此参数用来保证最低水平的并行操作.对数据段默认值为1,对索引段默认值为2.如果该参数被设置被设置为8,那么oracle服务器就能在任何时候都保证在一个数据块中可以有最多8个并行的事务.●MAXTRANS;定义了创建数据块或索引块时事务槽的最大值.如果并行的事务很多,所需要的事务槽个数可能超过INITRANS所设定的初始值,oracle会在块头中分配更多的事务槽,其数量的上线就是MAXTRANS所定的值,默认值为255提示:并行操作与数据块哦你关键利用率是相互矛盾的,如果将INITRANS和MAXTRANS设置的过大,这样不仅并行操作改进了,而且系统的效率也有所提高,但是由于数据块头的加大而使在数据块中所存储的数据减小.意见:没必要就不要改变它们的默认值控制数据空间使用的参数:PCTFREE和PCTUSED,这两个参数来管理数据块--手工数据块的管理Oracle允许通过使用如下参数来手工配置数据块以便更有效的管理和控制数据块中的磁盘空间的使用(在这里的数据块既可以包括数据段的块,也包括索引段中的块)●PCTFREE:该参数定义在每个数据块中预留空间的百分比.这部分空间只是在数据块中的数据行进行修改操作(update)而造成的增长时使用.默认值为10%●PCTUSED:该参数用来定义每个数据块中已经使用的空间百分比.只有当一个数据块中所使用的空间低于这一参数所设定值时,oracle才将这一数据块放入空闲队列.默认值40%●FREELISTS:该参数用来在一个段中定义空闲队列(free list)的个数.空闲队列是一个数据块的列表,这些数据块将被用作插入操作的候选数据块.在默认情况下,创建一个段时只有一个空闲队列.根据需要可以通过设置FREELISTS参数在一个段中创建多个空闲队列使用这些参数目的是为了提高系统的效率参数使用说明当PCTFREE小于或等于20%时不能插入,而当PCTUSED=40%时可以插入数据--行迁移与行连接行迁移(row migration):举例说明,某个数据块中已经存放如了n行记录,其中某条记录需要进行更新操作,被更新的值较多,在写入到数据块时,发现该数据块中的空闲空间已经不足以存储更新后的行记录,在这种情况下oracle不得不把这行记录从原数据块中移出来,存储到另外一个具有足够空间的数据块中.不过oracle并不是简单的将记录移走,因为有些对象如索引仍然保存着该条记录对应的位置,而从块中移动记录并不会触发索引的自动维护,为了确保该记录的实际存储位置发生迁移后,通过索引还能找到该条记录,oracle在移走该记录的是同时,还会在原块保留地址的一个指向.也就是留一个指针.行迁移造成的影响.当通过索引访问那条记录时,原来根据索引中记录的rowid即可通过一次I/O找到目标,不过现在只能找到目标数据的一个地址指针,因此不得不通过再一次I/O找到记录所在的新的位置,相当于查询时I/O负载提高了1倍行迁移的记录在数据库中比较高,那么系统的性能就会被明显拖累,因此降低数据库中的行迁移现象,是数据库调优的一项重要操作,通过适当设置块的PCTFREE参数值,可以在一定程度上降低产生迁移的机率,但并不可能完全杜绝.行连接(row chaining):当表中记录的长度超出了块大小时,就必然会产生行连接的情况.如当前块大小设置为8KB,如果某个表包含2个VARCHAR2(4000)的列并写满数据,对于这种记录,一个块无论如何也是放不下的,记录必然会被存储到多个块中.这种情况下,oracle就要在块中标记出该行记录连接的另一个块的位置.对于表中的列较多,或者含有大类型字段都极有可能出现这种情况,可以视为正常存储现象--自动管理块大小/自动管理段空间自动的段空间管理是一种在数据库段内部管理空闲空间的方法.该方法使用位图而不是使用空闲队列来追踪段内的空闲和使用空间.特点:●管理上的便利,因为PCTUSED,PCTFREE和FREELISTS等参数都是自动管理的●较好的空间利用,这种方法中所有对象,特别是行的尺寸变化很大的对象的空间利用率会更有效●并行插入(insert)操作性能有较大改进,改进了对并发访问变化的运行时调整限制:不能用于包含LOB的表空间1.自动的段空间管理,是使用位图(一个字节有8位,每个位两种状态0和1)来管理磁盘空间2.在一个自动管理的表空间中所有的位图管理段包含了一个位图,3.该位图描述了段中每一块与可获得可用空间相关的状态.4.这个位图存放在一组单独的数据块中,这组数据块被称为位图块(BMBs)5.插入新的一行时,服务器检索位图以找到一个具有足够空间的块6.当块中的可用空间数量发生变化时,位图中就会反映出它的新状态.--创建自动管理段空间*注意*自动的段空间管理,只能在表空间一级,而且是本地管理的表空间才能开启自动的段空间管理.在创建表空间时,在创建本地管理表空间命令中加入SEGMENT SPACE MANAGEMENTAUTO子句就可以完成自动段空间爱你管理配置SQL> create tablespace tbs2 datafile '/u01/app/oracle/oradata/mfs/tbs2_01.dbf' size 10M2 extent management local uniform size 1m segment space management auto;SQL> select tablespace_name,block_size,extent_management,segment_space_management2 from dba_tablespaces where lower(TABLESPACE_NAME)='tbs2';TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN------------------------------ ---------- ---------- ------TBS2 8192 LOCAL AUTOSQL> select tablespace_name,block_size,extent_management,segment_space_management from dba_tablespaces;TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN------------------------------ ---------- ---------- ------SYSTEM 8192 LOCAL MANUALUNDOTBS1 8192 LOCAL MANUAL……TBS 16384 LOCAL AUTOTBS2 8192 LOCAL AUTO因为数据字典dba_tablespaces的segment_space_management一列值为AUTO说明此表空间是一个自动管理的表空间--高水位线(High-warter mark, HWM)在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。

oracle中truncate和delete的区别比较

oracle中truncate和delete的区别比较

truncate和delete的区别比较文档作者: 叶玉虎创建日期: 2016-10-22更新日期: 2016-10-22Version: 1.文档控制更改记录审阅分发人员参考文献一.o racle中truncate和delete的区别比较在oracle数据库中,使用truncate和使用delete都可以实现删除一个表中的数据操作,但是它们却存在着很大的不同。

truncate的作用是清空一个表格,在删除数据方面,truncate与delete存在如下一些方面的不同:(1)在数据处理功能上,truncate是清空一个表的所有内容,它相当于delete fromtable_name。

(2)delete是DML操作,而truncate是DDL操作。

因此,用delete删除整个表中的数据时,会产生大量的rollback,占用很多的rollback segments,而truncate则不会,也就是说如果你使用truncate清空了一张表,那么想后悔都不行了。

(3)在内存中,用delete删除数据,表空间中被删除数据的表占用的空间还在,便于以后使用,另外它还是“假象”的删除,相当于在Windows中按下【DELETE】键删除数据把数据放到回收站中,还可以恢复。

当然,如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了。

(4)在内存中,用truncate清除数据,表空间中被删除数据的表占用的空间会被立即释放,相当于在Windows中按下【Shift+Delete】组合键删除数据,不能够恢复。

(5)truncate调整高水位线(High Water Mark,HWM),而delete不调整;使用truncate之后,table的HWM退回到INITIAL和Next的位置(默认位置),delete则不可以。

HWM一般是相对于一个表而言的,当一个表有数据不断插入时,HWM的值不断提高,对那些全表扫描的select查询是以HWM为终点的,即使表中可能只有一行记录。

Oracle 删除数据后释放数据文件所占磁盘空间

Oracle 删除数据后释放数据文件所占磁盘空间

测试的时候向数据库中插入了大量的数据,测试完成后删除了测试用户以及其全部数据,但是数据文件却没有缩小。

经查阅资料之后发现这是Oracle “高水位”所致,那么怎么把这些数据文件的大小降下来呢?解决办法如下:概念:表空间的相关知识请见这里,详细的介绍了Oracle 数据库的存储结构。

高水位:High Water Mark (HWM),是段(Segment)的一个指标,界定了段(Segment)曾经配置过的block 水位。

据说,随着数据的insert,所使用段(Segment)的数据块(data block)也不断增加,这时候高水位(HWM)也随着上升。

当数据被删除后(无论是delete 还是truncate table)虽然被占用的数据块(data block)已经相应减少,但是高水位(HWM)并不会随之下降。

当高水位(HWM)下存在大量的空白数据块(data block)时,如果发生全表扫描(Full Table Scan, FTS)就会造成很多额外的IO。

因为全表扫描(FTS)的时候读取段(Segment)中的数据块(data block)会一直读取到高水位(HWM)才结束。

高水位(HWM)就是段(Segment)中数据块(data block)有没有使用的分界线,所以全表扫描(FTS)所花费的时间不但不会因为数据的删除而减少,反而会增加。

(关于此段查询效率的内容有待验证,笔者未亲自验证。

不过可以确定的是高水位确实不会随着数据的删除而下降。

)降低高水位的正确做法是先降低HWM,再确定实际占有大小,再resize数据文件。

数据文件比较多,我们用其中一个较大的文件做为Demo,其它数据文件如法炮制即可。

我选择的文件是:D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF 1.4GB 左右。

1.登录sqlplus:语法:sqlplus username/password@hostname:port/sid例:sqlplus system/orcl@localhost:1521/orcl2.查询这个数据文件的编号:SQL> select file#, name from v$datafile;FILE# NAME------------------------------------------------------------------------------------------1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF可以看到,我们要操作的数据文件的编号是4。

Expert One-on-One Oracle阅读笔记6

Expert One-on-One Oracle阅读笔记6

Expert One-on-One Oracle阅读笔记第 6 章数据库表6.1表的类型1.堆组织表2.索引组织表3.聚簇表4.散列聚簇表5.嵌套表6.临时表7.对象表一张表最多有1000列;表的行数理论上没有限制;表上索引个数可以是列的全排列数,而且一次性能够使用32个;表的数量没有限制。

6.2术语高水位标记High Water Mark曾经包含数据的最右边的块。

在全表扫描时,Oracle将扫描高水标记一下的所有块,即使它们不含数据。

TRUNCATE将重新设置高水标记。

自由列表Freelist在Oracle中用来跟踪高水标记以下有空闲空间的块对象。

保留在高水标记以上的块,只有Freelist为空时才能被用到。

并行更新数据时,配置多个Freelist能提高整体性能,代价是增加了存储空间。

PCTFREE和PCTUSEDINITIAL, NEXT和PCTINCREASE建议使用Local Managed表空间并设置Extents大小相等。

而在没有使用Local Managed 表空间的情况下,建议总是设置INITIAL=NEXT和PCTINCREASE=0,以模拟Local Managed 表空间的使用。

MINEXTENTS和MAXEXTENTSLOGGING和NOLOGGINGINITRANS和MAXTRANS堆组织表6.3索引组织表数据在IOT中根据主键存储和排序。

IOT特别适用于IR(信息检索)、空间和OLAP应用程序。

IOT名义上是表,但它们的段实际上是索引段。

要显示空间使用等就要先把IOT表的名字转换成潜在的索引名。

默认值是SYS_IOT_TOP_<object_id>,object_id是为表分配的内部对象ID。

推荐在建表时指定索引名。

主要应用对只包含主键列的表:使用堆组织表将有100%多的额外开销;1.构建自己的索引结构:例如自己实现一个提供大小写不敏感查询的类似函数索引CREATE TABLE emp AS SELECT * FORM scott.emp;CREATE TABLE upper_name(x$ename,x$rid,PRIMARY KEY(x$ename,x$rid))ORGANIZATION INDEXASSELECT UPPER(ename),ROWID FROM emp;CREATE OR REPLACE TRIGGER upper_enameAFTER INSERT OR UPDATE OR DELETE ON empFOR EACH ROWBEGINIF (UPDATING AND (:OLD.ename||'x'<>:NEW.ename||'x'))THENDELETE FROM upper_nameWHERE x$ename=UPPER(:OLD.ename)AND x$rid=:OLD.rowid;INSERT INTO upper_ename(x$ename,x$rid) VALUES(UPPER(:NEW.ename),:NEW.rowid);ELSIF (INSERTING)THENINSERT INTO upper_ename(x$ename,x$rid) VALUES(UPPER(:NEW.ename),:NEW.rowid);ELSIF (DELETING)THENDELETE FROM upper_nameWHERE x$ename=UPPER(:OLD.ename)AND x$rid=:OLD.rowid;END IF;END;2.需要加强数据的共同定位或希望数据按特定的顺序物理存储时对应Sybase和SQL Server用户,这种情况会采用聚簇索引,而这可能达到110%的额外开销,而IOT没有。

oracle高水位详解

oracle高水位详解

1 row selected.
2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;
Statement processed.
3) SQL> SELECT table_name,num_rows,blocks,empty_blocks
Used
----------
0 ----这表名没有任何数据库块容纳数据,即表中无数据
1 row selected.
10) SQL> TRUNCATE TABLE big_emp1;
Statement processed.
WHERE table_name='BIG_EMP1';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
--------- -------- ------- ----------
BIG_EMP1 0 700 323
4) SQL> SELECT COUNT (DISTINCT
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
FROM big_emp1;
五、修正ORACLE表的高水位线
在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。
下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。

oracle降低高水位线教程

oracle降低高水位线教程

Oracle降低高水位线方法编制人:众所周知oracle数据库在使用到一段时间之后会有表空间文件变大并且占用磁盘空间较多的情况,这种情况叫做高水位线现象。

这时候一般都是数据库空间中的某些表数据量过大造成的,因为频繁的对某一个表进行大量的DML语句操作所以占用的空间会上升的很快。

如果一个表的数据量一直处于较大的情况会导致数据库在进行DML语句操作时运行缓慢,严重时会导致性能几句降低、死机等现象。

使用OB等工具查看现有数据库使用情况如下:当占用空间很大时,我们会第一时间想到删除数据库中无用的数据来降低磁盘占用率。

我们在使用delete语句在进行删除的时候会提示删除了XXXX条信息。

如,删除60天前的数据delete from z_testresult where starttime<=(sysdate-60);commit;--或者用这句delete FROM z_testresult where to_char(starttime,'yyyy-mm-dd')<to _char(sysdate-60,'yyyy-mm-dd');在删除了以上无用的数据之后我们通过OB等工具对数据库表空间的容量进行查得知,并没有减少。

从上图可以看出我们使用delete删除了数据之后数据库的空间占用率并没有下降,但是我们明明已经将数据删除并且提交了。

这实际上是与oracle的机制有关系。

在oracle的世界中数据文件占用的空间分为两类,一类是物理磁盘空间,一类是数据文件的逻辑空间。

物理空间我们可以正常理解就是我们正常可以从磁盘使用率中看到的磁盘使用大小;逻辑空间是当数据库文件使用了一定量的物理空间之后,数据具体在这个物理空间上占用了多少的块。

如果不好理解的话给大家举个例子,大家都使用过迅雷,迅雷在下载文件的时候采用了一种手段就是先占用一定的磁盘空间,但是不像这个空间写入数据只是先占用上,类似于画了个框不让其他数据进来,等下来到数据之后才开始向这个空间写入需要的东西。

如何处理ORACLE高水位的问题

如何处理ORACLE高水位的问题

什么是水线(High Water Mark)?----------------------------所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。

这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。

HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。

但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。

HWM数据库的操作有如下影响:a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。

如何知道一个表的HWM?a) 首先对表进行分析:ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;b) SELECT blocks, empty_blocks, num_rowsFROM user_tablesWHERE table_name = <tablename>;BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。

EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

让我们以一个有28672行的BIG_EMP1表为例进行说明:1) SQL> SELECT segment_name,segment_type,blocksFROM dba_segmentsWHERE segment_name='BIG_EMP1';SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS----------------------------- ----------------- ---------- ------- BIG_EMP1 TABLE 1024 21 row selected.2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;Statement processed.3) SQL> SELECT table_name,num_rows,blocks,empty_blocksFROM user_tablesWHERE table_name='BIG_EMP1';TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS------------------------------ ---------- ---------- ------------BIG_EMP1 28672 700 3231 row selected.注意:BLOCKS + EMPTY_BLOCKS (700+323=1023)比DBA_SEGMENTS.BLOCKS少个数据库块,这是因为有一个数据库块被保留用作segment header。

oracle 水位线概念

oracle 水位线概念

oracle 水位线概念
Oracle 水位线(Oracle High Water Mark)指的是数据库的事务日志(Redo Log)中最后一个成功写入磁盘的位置,也就是当前数据库中的数据记录最后被修改的位置。

在数据库发生崩溃或需要恢复的情况下,Oracle 恢复管理器会使用水位线作为恢复的起点,从而保证数据的完整性。

水位线是动态变化的,随着数据库中数据的插入、更新和删除操作不断进行,水位线也会不断移动。

因此,通过水位线可以判断数据库中的数据是否被修改过,也可以用于数据库备份和恢复等操作。

Kafka水位(highwatermark)与leaderepoch的讨论

Kafka水位(highwatermark)与leaderepoch的讨论

Kafka⽔位(highwatermark)与leaderepoch的讨论~~~这是⼀篇有点长的⽂章,希望不会令你昏昏欲睡~~~本⽂主要讨论0.11版本之前Kafka的副本备份机制的设计问题以及0.11是如何解决的。

简单来说,0.11之前副本备份机制主要依赖⽔位(或⽔印)的概念,⽽0.11采⽤了leader epoch来标识备份进度。

后⾯我们会详细讨论两种机制的差异。

不过⾸先先做⼀些基本的名词含义解析。

⽔位或⽔印(watermark)⼀词,也可称为⾼⽔位(high watermark),通常被⽤在流式处理领域(⽐如Apache Flink、Apache Spark等),以表征元素或事件在基于时间层⾯上的进度。

⼀个⽐较经典的表述为:流式系统保证在⽔位t时刻,创建时间(event time) = t'且t' ≤ t的所有事件都已经到达或被观测到。

在Kafka中,⽔位的概念反⽽与时间⽆关,⽽是与位置信息相关。

严格来说,它表⽰的就是位置信息,即位移(offset)。

⽹上有⼀些关于Kafka watermark的介绍,本不应再赘述,但鉴于本⽂想要重点强调的leader epoch与watermark息息相关,故这⾥再费些篇幅阐述⼀下watermark。

注意:由于Kafka源码中使⽤的名字是⾼⽔位,故本⽂将始终使⽤high watermaker或⼲脆简称为HW。

Kafka分区下有可能有很多个副本(replica)⽤于实现冗余,从⽽进⼀步实现⾼可⽤。

副本根据⾓⾊的不同可分为3类:leader副本:响应clients端读写请求的副本follower副本:被动地备份leader副本中的数据,不能响应clients端读写请求。

ISR副本:包含了leader副本和所有与leader副本保持同步的follower副本——如何判定是否与leader同步后⾯会提到每个Kafka副本对象都有两个重要的属性:LEO和HW。

高水位(HighWaterMark)的概念及高水位问题的解决

高水位(HighWaterMark)的概念及高水位问题的解决

高水位(H‎i gh W‎a ter ‎M ark)‎的概念及高‎水位问题的‎解决(转)‎上一篇‎/ 下一‎篇 20‎10-04‎-06 1‎0:36:‎19 / ‎个人分类:‎O racl‎e DB基‎础知识查‎看( 21‎2 ) /‎评论( ‎0 ) /‎评分( ‎0 / 0‎)高水‎位(Hig‎h Wat‎e r Ma‎r k)的概‎念及高水位‎问题的解决‎1、‎准备知识-‎o racl‎e的逻辑存‎储结构:表‎空间——>‎段——>区‎——>块‎块(bl‎o ck):‎是粒度最小‎的存储单位‎,现在标准‎的块大小是‎8K,有参‎数DB_B‎L OCK_‎S IZE指‎定。

ORA‎C LE每一‎次I/O操‎作也是按块‎来操作的,‎也就是说当‎O RACL‎E从数据文‎件读数据时‎,是读取多‎少个块,而‎不是多少行‎。

SQ‎L> sh‎o w pa‎r amet‎e r db‎_bloc‎k_siz‎eNA‎M E ‎‎‎ T‎Y PE ‎‎VALU‎E--‎-----‎-----‎-----‎- ---‎-----‎--- -‎-----‎-db‎_bloc‎k_siz‎e‎ in‎t eger‎‎8192‎区(ex‎t ent)‎:由一系列‎相邻的块而‎组成,这也‎是ORAC‎L E空间分‎配的基本单‎位,举个例‎子来说,当‎我们创建一‎个表A时,‎首先ORA‎C LE会分‎配一区的空‎间给这个表‎,随着不断‎的INSE‎R T数据到‎A,原来的‎这个区容不‎下插入的数‎据时,OR‎A CLE是‎以区为单位‎进行扩展的‎,也就是说‎再分配多少‎个区给A,‎而不是多少‎个块。

一个‎e xten‎t包含多少‎个bloc‎k是由创建‎表空间时指‎定的,类似‎:exte‎n t ma‎n agem‎e nt l‎o cal ‎u nifo‎r m.s‎i ze1m‎。

默认情况‎下一个ex‎t ent对‎应8个bl‎o ck,即‎64k。

Oracle 10g HWM原理及性能优化

Oracle 10g HWM原理及性能优化

Oracle 10g HWM原理及性能优化
蔡焰
【期刊名称】《微型机与应用》
【年(卷),期】2013(32)8
【摘要】HWM(High Water Mark)是表中已经使用过的存储空间与未使用过的存储空间之间的分界线,HWM对全表扫描的性能有非常大的影响.当全表扫描
时,Oracle会读取HWM下所有的块,即使这些块中有很多是空块,空块的存在,也即是表中碎片的存在,必将增加全表扫描额外的物理I/O开销及CPU开销,严重降低访问Oracle数据表的性能.通过对Oracle中关于表中HWM的原理及性能优化问题的讨论,针对HWM下的碎片问题提出相关的优化策略,并对其空间重组前后进行性能对比测试.
【总页数】4页(P1-3,6)
【作者】蔡焰
【作者单位】广东韶关学院图书馆,广东韶关512005
【正文语种】中文
【中图分类】TP311.138
【相关文献】
1.ORACLE 10G自动化特性在联通BSS系统性能优化工作中的应用 [J], 王卫;唐巍
2.ORACLE 10g数据库性能优化与分析 [J], 付海龙;祝永志
3.Oracle 10g数据库系统性能优化与调整 [J], 孙风栋;闫海珍
4.ORACLE 10g数据库性能优化与分析 [J], 付海龙;祝永志;
5.关于Oracle 10g数据库系统性能优化与调整的研究 [J], 李瑛
因版权原因,仅展示原文概要,查看原文内容请购买。

oracle降低高水位线教程

oracle降低高水位线教程

Oracle降低高水位线方法编制人:众所周知oracle数据库在使用到一段时间之后会有表空间文件变大并且占用磁盘空间较多的情况,这种情况叫做高水位线现象。

这时候一般都是数据库空间中的某些表数据量过大造成的,因为频繁的对某一个表进行大量的DML语句操作所以占用的空间会上升的很快。

如果一个表的数据量一直处于较大的情况会导致数据库在进行DML语句操作时运行缓慢,严重时会导致性能几句降低、死机等现象。

使用OB等工具查看现有数据库使用情况如下:当占用空间很大时,我们会第一时间想到删除数据库中无用的数据来降低磁盘占用率。

我们在使用delete语句在进行删除的时候会提示删除了XXXX条信息。

如,删除60天前的数据delete from z_testresult where starttime<=(sysdate-60);commit;--或者用这句delete FROM z_testresult where to_char(starttime,'yyyy-mm-dd')<to _char(sysdate-60,'yyyy-mm-dd');在删除了以上无用的数据之后我们通过OB等工具对数据库表空间的容量进行查得知,并没有减少。

从上图可以看出我们使用delete删除了数据之后数据库的空间占用率并没有下降,但是我们明明已经将数据删除并且提交了。

这实际上是与oracle的机制有关系。

在oracle的世界中数据文件占用的空间分为两类,一类是物理磁盘空间,一类是数据文件的逻辑空间。

物理空间我们可以正常理解就是我们正常可以从磁盘使用率中看到的磁盘使用大小;逻辑空间是当数据库文件使用了一定量的物理空间之后,数据具体在这个物理空间上占用了多少的块。

如果不好理解的话给大家举个例子,大家都使用过迅雷,迅雷在下载文件的时候采用了一种手段就是先占用一定的磁盘空间,但是不像这个空间写入数据只是先占用上,类似于画了个框不让其他数据进来,等下来到数据之后才开始向这个空间写入需要的东西。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Figure 12-23 HWM at Table Creation
Suppose that a transaction inserts rows into the segment. The database 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.
1.4 表空间: 包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.
表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
/tianlesoftware/archive/2009/12/08/4962476.aspx
Oracle Table 创建参数 说明
/tianlesoftware/archive/2009/12/07/4954417.aspx
二. 高水线(High Water Mark)
2.1 官网说明如下
/docs/cd/E11882_01/server.112/e16508/logical.htm#CNCPT89022
1.3 段: 是由一系列的区所组成, 一般来说, 当创建一个对象时(表,索引),就会分配一个段给这个对象. 所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE Dave,这个段就是数据段,而CREATE INDEX ON Dave(NAME), ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得.
In Figure 12-24, the blocks below the HWM are allocated, whereas blocks 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-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 location 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.
当我们创建了一个表,即使我没有插入任何一行记录, ORACLE还是给它分配了8个块. 当然这个跟建表语句的INITIAL 参数及MINEXTENTS参数有关. 如:
STORAGE
(
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
);
也就是说,在这个对象创建以后,ORACLE至少给它分配一个区,初始大小是64K,一个标准块的大小是8K,刚好是8个BLOCK.
To manage 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 session 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 HWM.
Oracle 高水位(HWM: High Water Mark) 说明Oracle 高水位(HWM: High Water Mark) 说明
一. 准备知识:ORACLE的逻辑存储管理.
ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块.
(1)Above the HWM
These blocks are unformatted and have never been used.
(2)Below the HWM
These blocks are in one of the following states:
(1)Allocated, but currently unformatted and unused
Figure 12-26 Advancing HWM and Low HWM
When the blocks between the HWM and low HWM are full, the HWM advances to the right and the lo
Figure 12-24 HWM and Low HWM
In Figure 12-25, the database chooses a block between the HWM and low HWM and writes to it. The database could have juck 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 the newly filled block are unformatted.
(2)Formatted and contain data
(3)Formatted and empty because the data was deleted
Figure 12-23 depicts an ASSM segment as 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.
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 sin
Assume that a new transaction inserts rows into the table, but the bitmap indicates that insufficient free space exists under the HWM. In Figure 12-26, the database advances the HWM to the right, allocating a new group of unformatted blocks.
gle 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 list. 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.
相关文档
最新文档