concepts 阅读总结2——存储-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

concepts 阅读总结2——存储

简介: 1、可用空间管理: 首先说明这里的可用空间和块中的“可用空间区”不是一个概念,这里是指段里的没有被用的可用空间,段内已用与可用空间以位图(bitmap)的形式记录,但是可用块是以另外一种位图的形式管理的,注意区分。

1、可用空间管理:

首先说明这里的可用空间和块中的“可用空间区”不是一个概念,这里是指里的没有被用的可用空间,段内已用与可用空间以位图(bitmap)的形式记录,但是可用是以另外一种位图的形式管理的,注意区分。


段空间自动管理(Automatic segment-space management)具备以下优势:

  • 易于使用
  • 空间利用效率更高,尤其针对每行数据容量差异大的表(或其他对象)
  • 能够更好地针对当前数据的情况实时调整
  • Better multi-instance behavior in terms of performance/space utilization

用户在创建表空间的时候就可以指明选择 段空间自动管理(Automatic segment-space management),这样在这个表空间内的段都会使用自动段空间管理。

有两种sql语句可以增加可用空间的大小,分别是delete和update(修改的更小的时候);这两种操作释放的空间可以被后续的insert语句使用:

*如果insert语句和上述操作位于同一个事物,且在上述操作之后,那么空间可以被直接使用。

*如果insert语句和上述操作不位于同一事物,那只能等到释放空间的语句提交,且插入语句正好用到此处的刚刚释放的空间,那才可以用。


数据块(data block)中被释放出的空间未必与可用空间区(free space)相连续。Oracle在满足以下条件时才会将释放的空间合并到可用空间区:(1)INSERT 或 UPDATE语句选中了一个有足够可用空间容纳新数据的数据块,(2)但是此块中的可用空间不连续,数据无法被写入到数据块中连续的空间里。Oracle只在 满足上述条件时才对数据块中的可用空间进行合并,这样做是为了避免过于频繁的空间合并工作影响数据库性能。


行链接与行迁移: 有两种情况会导致表中的行的数据量过大,一个行无法容纳,当数据块内插入数据量大的数据类型的行时,就像long ,或者long raw,此时行连接不可避免,这时oracle将这行数据存储在这个段的多个块中,并链接起来。

第二种情况就是原本存在一个块中的信息,由于新插入的数据行过大,即使把这个块全部填满也装不下,这样我们可以把这个块的数据行迁移到另一个块中,但是要保证原来数据块上有一个指向新数据块的指针,并且数据行的rowid保持不变。


手动空间管理manually managed tablespaces

在手动管理的表空间(manually managed tablespaces)中,用户可以使用 PCTFREE 和PCTUSED 这两个存储管理参数来控制对某段(segment)进行插入和更新操作时,如何利用属于此段的数据块(data block)中的可用空间。用户也可以在创建或修改索引时为其设定 PCTFREE 参数(索引存储在索引段(index segment)中)。

2、数据扩展概述和管理:

当用户创建数据表时,Oracle为此表的数据段(data segment)分配一个包含若干数据块(data block)的初始数据扩展(initial extent)。虽然此时数据表中还没有数据,但是在此初始数据扩展中的数据块已经为插入新数据做好了准备。如果一个段(segment)的初始数据扩展(initial extent)中的数据块(data block)都已装满,且有新数据插入需要空间时,Oracle自动为这个段分配一个增量数据扩展(incremental extent)。增量数据扩展是一个段中继已有数据扩展之后分配的后续数据扩展,她的容量大于或等于之前的数据扩展。

为了管理的需要,每个段(segment)的段头(header block)中包含一个记录此段所有数据扩展(extent)的目录。


每个段的定义中还包括了数据扩展的存储参数,这个参数控制着如何为段分配可用的空间。。

例如,用户可以在 CREATE TABLE 语句中使用 STORAGE 子句设定存储参数,决定创建表时为其数据段(data segment)分配多少初始空间,或限定一个表最多可以包含多少数据扩展。如果用户没有为表设定存储参数,那么表在创建时使用所在表空间(tablespace)的默认存储参数。


用户既可以使用数据字典管理的表空间(dictionary managed tablespace)(依赖数据字典表监控空间的利用情况),也可以使用本地管理的表空间(locally managed tablespace)(使用位图(bitmap)来标记可用与已用空间)。由于本地管理的表空间性能较好且易于管理,当用户没有显式地设定数据扩展(extent)管理参数时,除了 SYSTEM之外的所有永久表空间(permanent tablespace)默认使用本地管理方式。

在一个本地管理的表空间中,其中所分配的数据扩展(extent)的容量既可以是用户设定的固定值,也可以是由系统自动决定的可变值。当用户创建表空间(tablespace)时可以使用 UNIFORM (用户指定)或 AUTOALLOCATE (由系统管理)子句设定数据扩展的分配方式。

  • 对于固定容量(UNIFORM)的数据扩展,用户可以为数据扩展设定容量或使用默认大小(1 MB)。用户须确保每个数据扩展的容量至少能包含5个数据块(database block)。本地管理(locally managed)的临时表空间(temporary tablespace)在分配数据扩展时只能使用此种方式。
  • 对于由系统管理(AUTOALLOCATE)的数据扩展,由Oracle决定新增数据扩展的最佳容量,其最小容量为 64 KB。如果创建表空间时使用了“segment space management auto”子句,且数据块容量大于等于 16 KB,Oracle扩展一个段时(segment)所创建的数据扩展的最小容量为 1 MB。对于永久表空间(permanent tablespace)上述参数均为默认值。
数据拓展的分配和回收:

oracle会根据表空间管理的方式不同(分为两中表空间管理的方式:数据字典管理(dictionary manage tablespace)和本地管理(localhost managed tablespace))选择不同的数据扩展的分配算法。

  对于常用的本地管理,oracle在分配数据拓展的时候,首先-选择一个属于此表空间的数据文件,再搜索此数据文件的位图,查找连续的数据块,如果此数据文件中有连续的数据块空间可用,则分配,否则找下一个数据文件。

一般来说,在用户将一个段(segment)对应的方案对象(schema object)移除(使用DROP TABLE 或 DROP CLUSTER 语句)之前,此段的数据扩展(extent)不会被回收到表空间(tablespace)中,但是以下情况例外:

  • 表,簇表的所有者(owner)或拥有 DELETE ANY 权限的用户, 可以使用TRUNCATE...DROP STORAGE 语句将表,簇表的数据清除
  • DBA 可以使用以下语法收回一个段中未使用的数据扩展:

    ALTER TABLE table_name DEALLOCATE UNUSED;
  • 如果用户为回滚段(rollback segment)设定了 OPTIMAL 参数,Oracle将周期性地从其中回收数据扩展。
当数据扩展(extent)被释放后,Oracle修改数据文件(datafile)中的位图(bitmap)(对于本地管理的表空间)或更新数据字典(对于数据字典管理的表空间),将回收的数据扩展视为可用空间。被释放的数据扩展中的数据无法继续访问。

3、数据块的结构:


数据块头:(包括标准内容和可内容)一般是此数据块的地址(block address) 和 此数据块所属段的类型(是表呢?还是索引呢?)

表目录区:如果一个表在这个数据块中存储了数据行,那么这个表目录区就记录了这个表的信息。

行目录区:此区域包含了每个数据行(或者一个行的片段,因为或许这个行非常的长,直接把这个块用没了还没有完)的地址;还有一个事,就是如果行数据区的所有数据被删了,但是行目录区的内容是不会跟着被删除的,直到下一次这个块被写入数据时,行目录区才会被重新利用写入。


数据块头(data block header),表目录区(table directory),行目录区(row directory)被统称为管理开销(overhead)。其中 有些开销的容量是固定的;而有些开销的总容量是可变的。数据块中固定及可变管理开销的容量平均在84到107字节(byte)之间。


在新分配的数据块中,用于插入的数据块空间的容量等于数据块的大小减去数据块头的大小再减去预留的可用空间(PCTFREE);但是用于更新的数据空间是比用于插入的数据空间大的,因为PCTFREE留出来的空间就是用来做更新的

,也就是说,可以是用pctfree里面的空间。




对于老版本的手动段空间管理,使用的是链表的方式管理,用户可以使用 PCTFREE 和PCTUSED 这两个存储管理参数来控制对某段(segment)进行插入和更新操作时,如何利用属于此段的数据块(data block)中的可用空间。

在一个数据段或者索引段中,oracle管理着一个或者多个可用块列表(在一个段中使用多个可用块列表,可以避免并行插入操作引发的数据块争用),其中这些列表列出了属于这个段的所有的数据扩展中可用空间比例大于PCTFREE的的数据块,这些数据块可以被用来insert数据。当插入一行数据的时候,oracle从列表中提取出第一个可用的数据块,如果插入的数据比可用的容量还要大,那就装不进去了,此时看块内的数据量是否大于PCTUSED,如果大于,oracle就把此块从可用列表中移除,如果小于,则等待下次继续使用

当执行了delete或者update后,并且做了提交,这时oracle会检查相关的数据块容量是不是变得小于PCTUSED的要求了,如果小于,那这些块就会被优先放在这个事务所使用的可用块列表中,供这个事务下面的操作使用,该事务提交后,这些块也可以被其他事务继续使用。。。

关于块的理解,转载了一篇文章:

http://blog.csdn.net/changyanmanman/article/details/7265844



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章