探究 Oracle 高水位对数据库性能影响

2016-08-11 陈龙 恩墨学院

探究 Oracle 高水位对数据库性能影响1
大家好!我是来自云和恩墨的陈龙,目前主要负责Oracle技术支持工作。在我开始学习Oracle 的时候就听eygle老师说过,要想学好技术,一定要要多做实验,多做学习记录,理论与实践相结合,才能真正理解吸收那些知识,所以今天我想分享一下对Oracle高水位线与SQL访问性能相关性的研究体会。谈不上很深入的研究,只是想与大家分享我的Oracle学习过程,希望能与大家交流进步。之所以分享这个学习内容,是因为在我曾经经历的一些优化项目中,遇到由于高水位导致SQL访问性能下降的问题,这促使我想更深入的去理解:什么是高水位线? 高水位到底会带来哪些影响? 应该怎样更好的解决高水位带来的问题?在开始深入分析之前,让我们先来了解一下高水位线HWM。
1HWM的基本原理(概念)在Oracle中,高水位线(High-warter mark, HWM)被用来形容数据块的使用位置,即说明那些块是已经被使用的,那些没有。在创建一个新的表时,Oracle 就会为这个对象分配一个段。在这个段中,第一个区的第一个块在创建时就会被分配存储一些表头信息。高水位的管理机制在MSSM和ASSM中不同,下面分别介绍这两种管理机制:手动段空间管理(MSSM)在以往的手动段空间管理中(MSSM),高水位标记HWM, 一个段分成三部分,header block,used block(row data),unused block,其中used block和unused block之间的分界线就是高水位标记HWM,当进行全表扫描的时候,会扫描到HWM下的所有数据块,即使used block中很多数据被删除了,全表扫描还是以HWM为准。当插入insert时,freelist中没有空闲块,HWM会向上移动,但是只会向上移动,不会自动收缩,即使delete大量数据,导致HWM下有很多空闲块。如下图:

第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储存了一些信息,基中HWM的信息就存储在此。此时,因为第一个区的第一块用于存储段头的一些信息,虽然没有存储任何实际的记录,但也算是被使用,此时HWM是位于第2个块当我们不断插入数据到PM_USER后,第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据。

在向表里插入数据后,HWM本身也向上移.也就是说,当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块。

当对表进行导出,导入后,或者move等操作后,HWM就会降低到真实水平上。自动段管理(ASSM)在自动段管理(ASSM)中,利用位图来代替空闲列表,当会话向表插入数据时,数据库只格式一个单独的位图块,而不是像MSSM中那样,会预先格式化一组块。

在ASSM表空间中,除了一个HWM外,还有一个低HWM。在MSSM中,HWM推进时,所有的块都会格式化并立即生效,这样Oracle 就可以安全的读取这些块。但是对于ASSM,当HWM推进时,Oracle 并不会立即格式所有的块,只是在第一次使用的时候才会对这些块进行格式化。也就是说,在第一次使用的的时候,即进行insert 操作时,数据会插入到块中的任意水位线,位于低水位线(LHMW)和高水位线(HHMW)之间。因此在这个区域的许多块就不会被格式化。在一个ASSM段中的每个数据块可能为这些状态:◎ 在HWM之上这些块都是没有格式化,且没有被使用◎在HWM之下这些块会处于这些状态之一:• 已经分配,但是没有被格式化且没有被使用• 已经格式化且包含数据• 已经格式化,但是已经删除数据,块为空下面来了解整个过程:

如图所示,在没进行数据插入前,段中的所有数据块都是没有格式化的且没有被使用。假设这个时候某会话将数据插入时,数据库会把数据写到任何可以利用的空间块中。如下图所示:

数据库也可能会选择HWM和低HWM之间的任何数据块,或者低HWM之下的任何可用的空间的块。注意低HWM位置,因为HWM之下的块只有在被使用的时候,才进行格式化,所以当存在数据扫描时,特别是全表扫描,Oracle 会读取到低HWM的位置。如下图所示:

如果某条会话将数据插入到某表中,但是在当前的HWM之下没有足够的可用空间,那么这个时候Oracle 会推进HWM,重新分配一组新的没有格式化的块。当HWM与低HWM之间的位置被填满时,HWM会继续往前推进,而低HWM会相应的推进到旧的HWM位置中。以此类推,当数据库不断的插入数据,HWM会持续往前推移,而低HWM会尾随其后,除非重建、或缩小该对象等,否则HWM从不往回退。

2HWM 演示过程(上)原理描述完了,那么现在我们来测试一下,验证之前我们所描述的部分。我们先从MSSM管理的方式开始:

新建一个表,然后存储分配较多的对象,

插入较多的数据,

现在来查询下全表扫描所花时间,

从执行计划来看,该查询走得时全表扫描,期间产生6278个物理读,30028个逻辑读。现在来分析该表,查看统计信息,

从该表的统计信息来看,该表公有15384个块,其中没有用到的块有0个,共有1003089行。现在来测试下delete对hwm的影响,

从统计信息来看,该表使用的块还是15384个块,但是空余块依然是0个,按道理来说,在delete 后,应该会有空余的块才对。其中,这里可以看出行数已经变为了0.从这里就可以验证了之前的说法,即HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移。这就会造成RACLE的全表扫描是读取ORACLE高水位标记下的所有BLOCK,也就是说,不管HWM下的BLOCK现在实际有没有存放数据,ORACLE都会一一读取,这样,在DELETE表后,ORACLE读了大量的空块,耗去了大量的时间测试环境没有show_space 这个过程,现在声明它:

那么这个就是HWM所有的BLOCK编号。

时间: 2024-10-20 06:38:33

探究 Oracle 高水位对数据库性能影响的相关文章

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

Oracle高水位High Water Mark(HWM)简介

1.什么是高水位 高水位是Oracle中使用和未使用空间中的边界线,也可以理解为数据文间和非数据文间的分界线,但是这里的数据文件指代的是存储过数据的数据文件,而非仅仅是数据表中有数据的数据文件. 2.高水位对于检索的影响 假设我们有个表有2百万行数据存储在几个区中,假如我们删除一百万条数据.尽管数据区中的数据没有了,但是Oracle中占用的区的数据空间仍然不变,与原来二百万条数据占用的数据空间是一样的.当我们在数据库中执行查询时,Oracle仍会遍历所有的数据块,即便这些数据块中没有数据.从这个

oracle高水位

oracle高水位http://www.cnblogs.com/chuyuhuashi/p/3548260.htmlhttp://blog.csdn.net/wyzxg/article/details/5631721 数据表删除数据或者数据分区后,数据文件并没有减小.这是oracle数据库高数位high water mark造成的.尽管用delete删除了数据,数据已经不在数据块中,但是,原有的数据块并不会被回收回去,只是被标记为空闲可用的了.就是说空间只要被划分给了oracle,形式上就会被o

Oracle 高水位(HWM: High Water Mark)

一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个Block里可以包含多个row. 1.2 区: 由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先ORACLE会分配一区的空间给这个表,随着不

Oracle 高水位说明和释放表空间,加快表的查询速度

高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表需要的存储空间:表以数据块的形式存储在数据文件中,表的存储结构是:行×行数,如果知道了总共有多少行,每行的平均长度,两者相乘,再除于90%的使用率,那么就可以知道实际需要存储的空间: 表的存储结构; 从统计信息得出平均每行的长度和总共的行数,从而知道存储的SIZE: 查找表实际存储的空间:数据实际存

Oracle 高水位(HWM)回收原理及操作方法

一.  高水位(HWM)及其产生原因 High Water Mark,HWM) 是Oracle(Segment)级别的概念.在仅有DML(比如delete,insert)操作时,高水位线只会增长,不会降低.具体来说,由于程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位. 下图为一个Segment内高水位不断增长的示意图: 注:一个表在初次插入记录时,Oracle会为其分配Segment和block. 插入大量数据后,高水位线随之增长 当数据

[Oracle]高水位标记(HWM)

(一)高水位标记(High Water Mark,HWM)的概念 所谓高水位标记,是指一个已经分配的段中,已经使用的空间与未使用的空间的分界线.在表的使用过程中,随着数据的不断增多(insert),HWM不断向数据段未使用部分方向移动,而在删除数据(delete)的过程中,HWM并不会向反方向移动,即使删除全部数据,HWM依然不会改变.但是如果使用了truncate命令,则表的HWM会被重置为0. 图1.segment (二)高水位标记的影响 全表扫描要读出直到HWM标记的所有的属于该表的数据块

Oracle 高水位问题

Oracle 对数据段的管理有一个高水位(HWM, High Water Mark)的概念.高水位是数据段中使用过和未使用过的数据块的分界线.高水位以下的数据块是曾使用过的,以上的是从未被使用或初始化过的. 当 Oracle 进行全表扫描(FTS, Full table scan)的操作时,它会读高水位下的所有数据块.如果高水位下还有很多空闲空间(碎片),读取这些空闲数据块会降低操作的性能. 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会

【粗浅分析】关于外链接查询数据库性能影响,及底层机制分析

开始编辑时间:2016-06-17 19:16:57 先交代下背景 最近进行了一个小模块的开发,由于几个数据表之间的联动比较多,所以外链接次数也有几次. 但是公司本来就是禁止随便使用外链接语句的,但是不用外链接的话达不到想要的效果(自己经验不够,想不到别的解决办法). 期间在网上搜索了一下有什么别的解决办法,但是效果都没有达到预期,而且看到也有人问过类似的问题,而且有很多人不理解为什么不用能外链接,还有的人说,不用外链接还用什么关系数据库. 后来请教了上司,得出结果是外链接可以用,不过要小心注意