表空间碎片化一二

最近遇到一个问题,有人说表空间的自动扩展会带来碎片化,我觉得这是一个误区,有必要说说。

1.什么时候开始出现碎片化?
表空间是一个逻辑的概念,为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空间可以包含多个数据文件。
表空间存放的是段(segment)。而段是数据库一种逻辑结构,包括表段,索引段,回滚段等,段存在于表空间中,并对应一定的存储空间。

那什么时候开始出现碎片化呢?
所有的Oracle段(为了理解方便,后面把segment作为表的一个同义词)都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。
这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。原则上HWM只会增大,不会缩小,即使将表中的数据全部删除(delete),HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。
回过头来,当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在连续的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择),而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。

以上就是产生碎片化的原因。最理想的状况就是一个表初始化后所有段都是连续的,这样就不会有碎片,但是实际生产中不可能所有的表都是不变的。只要表的数据一发生变化就会存在扩展,一涉及到扩展,数据库就有可能申请到分隔开的较小的自由空间,所以说碎片化的产生和和表空间自动扩展还是手工扩展没有啥关系。如果非要保证表空间不会出现碎片化,那么就只有一种可能----数据库不会再发生变化。

2.怎么调整表空间的大小?
表空间是一种逻辑的概念,所谓调整表空间大小其实就是调整这个表空间所对应的物理上的数据文件的大小。
一个表空间可以包含多个数据文件,这些数据文件可以一部分是自动扩展的,可以一部分是不能自动扩展的。
调整表空间的手段有:
(1)添加数据文件
(2)给数据文件设置自动扩展:在块大小为8K的表空间,最大值为:32768M,换句话说,如果这个表空间的某一个数据文件的初始值是10G,那么将该数据文件设置为自动扩展后,该数据文件的最大值能达到32G,而当这个数据文件达到了32G后,如果需要扩展表空间的大小,那么仍然需要添加新的数据文件。
(3)对数据文件进行resize。这个用在2个地方:第1个是觉得初始化的数据文件过大需要收缩可以用;第2个是初始化的数据文件过小,且关闭了自动扩展,那么也可以用resize来使得数据文件变大。

3.是否需要设置表空间自动扩展呢?
个人觉得很有必要,为什么呢?当表空间被写满的时候,如果没有自动扩展的功能,那么相应的表空间就会报错夯住,数据写不进去,这个时候就会影响业务了。而Oracle自身就提供了数据文件自动扩展的功能,我们为什么不用它呢?非要自己监控然后自己再去手工resize来扩展表空间以获取更多的犯错几率?

4.自动扩展是否会影响性能?
当然会影响性能!假设初始化一个表空间只有一个数据文件且这个数据文件设置了自动扩展,这个数据文件只有10G。当表空间满了达到10G的时候,数据文件会一边扩展一边写入数据,肯定对数据库的性能有影响。

表空间能自动扩展的触发条件是什么?
(1)表空间满了
(2)对应的数据文件还有扩展的空间(8K的块大小对应的数据文件最大为32G)
如果表空间满了,而且它对应的数据文件已经扩展到最大的32G了,那么当自动扩展开始的时候,这个表空间仍然会报错,告知无法扩展。

怎么避免或者减少自动扩展带来的性能问题呢?
最不差钱的方法就是咱存储空间特别多先给表空间分配足够多足够大的数据文件;如果没有那么多存储的话,那就在初始化表空间的时候分配一定数量的数据文件,将一部分直接设置为最大的32G,另外一部分初始化为10G并让其自动扩展。剩下的就是监控表空间使用率,当表空间达到一定阈值的时候,对其添加新的数据文件。

时间: 2024-10-15 07:02:36

表空间碎片化一二的相关文章

Oracle 数据库表空间碎片查询和整理

dba_free_space 显示的是有free 空间的tablespace ,如果一个tablespace 的free 空间不连续,那每段free空间都会在dba_free_space中存在一条记录.如果一个tablespace 有好几条记录,说明表空间存在碎片,当采用字典管理的表空间碎片超过500就需要对表空间进行碎片整理. select a.tablespace_name ,count(1) 碎片量 from dba_free_space a, dba_tablespaces b wher

MySQL 清除表空间碎片

碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作, 会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行,每行10字节,会占用10万字节存储

本地管理表空间(LMT)与自动段空间管理(ASSM)概念

创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent management local(本地管理表空间)是在表空间的头部用位图区记录extent(区)的使用情况(是否为free).与之相对的是字典管理表空间,用数据字典记录extent使用信息. segment space management auto(段空间自动管理)是在段的头部使用位图管理块(BM

oracle 数据库碎片化管理

******************************************************************************** 1.表空间碎片 ******************************************************************************** ----1.查看fsfi值 select a.tablespace_name, trunc(sqrt(max(blocks)/sum(blocks))* (10

为什么越学反而越蠢?碎片化学习是个骗局

来源于:https://news.cnblogs.com/n/558233/ 编者按:本文来自微信公众号"古典古少侠"(ID:gudian515),作者古典 先给你讲个故事,看你有没有中招: 有一天,你的朋友给你"知识装逼"了一个术语,牛!怎么知道的?--他推给你一个公众号. 你开始关注,觉得哇!大神!牛逼!长见识! 每天刷每天刷每天刷.很多问题也有了解决方法--按照这个进度,过 3 年就能理解宇宙终极奥义了. 慢慢你有了十多个类似的号,承包了你从专业.生活.工作.

oracle存储结构_表空间-笔记

oracle数据库,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.一个ORACLE数据库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的数据库文件. 表空间的定义:存放数据的一个容器.表空间由一个数据文件或多个数据文件组成,一个数据文件只属于一个表空间.-----(这个容器会随着数据文件的增加而增大) 表空间的作用能帮助DBA用户完成以下工作:    1.决定数据库实体的空间分配;    2.设置数据库用户的空间份额;    3.控制数据库部分数据

表空间常用sql汇总

表空间碎片相关:select tablespace_name,       round(sqrt(max(blocks) / sum(blocks)) *             (100 / sqrt(sqrt(count(blocks)))),             2) FSFI,       (case         when sqrt(max(blocks) / sum(blocks)) *              (100 / sqrt(sqrt(count(blocks)))

如何构建自己的知识体系-碎片化学习的骗局

现在年底流行知识跨年,今年毫无例外的知识跨年又刷屏了,其中最出名的莫过于罗振宇的"时间的朋友“跨年演讲及吴晓波的跨年演讲,不瞒大家说,我曾经是吴晓波频道.罗辑思维忠实的读者,每天早上会准时收听罗辑思维的60秒语音及相关文章,也会每周观看吴晓波频道音视频及相关文章,在每次读完相关文章及观看完音视频以后,感觉收货颇多:为此还向自己的父母推荐过,曾经在脑子里还想象过,如果我这样长期的坚持下去,一定会成为一个特别优秀的人:经过自己长时间的学习,确实扩展了自己的知识面,知道了更多的名词,但是感觉整体的认知

【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间

本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 核心是利用mysql系统表和“optimize table 表名”命令,对mysql数据表进行空间的释放.由于delete和drop table都不会释放表空间(truncate 命令会释放表空间[将所有的数据都删除]),所以需要利用optimize 命令进行释放. 这个存储过程目的是给一个库的所有表来整理碎片的.一个表随着插入很频繁,或者一直更新不停的,就会积累好多碎片.如果及时整理一下,查询效率会高出好多. D