深入解读oracle数据块实现的原理
把笔放在这儿。
Oracle管理存储空间数据库中的数据文件(数据文件)的单位是数据块(数据块),一个数据块是最小的(逻辑)数据库中的数据单元,对应的数据块,在操作系统级别的所有数据的最小的物理存储单元是一个字节(字节),每个操作系统都有一个参数,称为块容量(块大小),Oracle会访问整数(甲骨文)的数据块,每次获取数据,而不是访问数据,根据操作系统块的能力。
标准数据块(数据块)的数据库的容量是由初始化参数指定db_block_size.in之外,用户还可以指定五个非标准数据块容量(nonstandardblock大小)。该数据块的块容量应设置为操作系统的块容量的整数(同时较小比最大块容量限制)以减少不必要的我/ O操作。Oracle数据块是Oracle可以使用和分配的最小存储单元。
数据块结构
在Oracle中,数据块是否存储在表(表)、索引(索引)或集群表(群集数据)中,块的内部结构类似。方框图如下所示:
该图显示了数据块的各个部分,包括:数据的大小(包括标准内容和变量的内容(常见)和可变头(表),表目录目录(目录),行目录(免费),免费空间),行数据区(行数据)的图。这两个箭头表示数据块中的可用空间区域的容量是可变的。
数据块(包括标准内容和可变内容)
数据头(头)包含数据块的轮廓信息,如块地址和数据块的类型(段),例如表或索引。
表目录区
如果数据表存储数据块中的数据行,则数据表的信息将被记录在数据块的表目录区(表目录)中。
行目录区
这个区域包含在数据区(行数据区)中存储在数据块中的数据行(每个行块的地址)的信息。{数据块可以保存完整的数据行,并且只能保存部分数据行,因此本文使用了行}。
当使用数据块(数据块)的行目录区域(行目录)空间时,即使删除了数据行,也不会恢复行目录空间。例如,当清除包含50个记录的数据块时,它的块(头)的行目录区域仍然占用100字节(字节)空间。
管理开销
数据块(数据块头部),表目录区(目录),且行目录区(rowdirectory)统称为管理开销(开销)。一些的开销是固定的,和一些开销的总容量是可变的,固定的和可变的管理开销的数据块的容量是84和107字节(byte)之间。
行数据
数据块(数据块)中的行数据区域(行数据)包含表或索引的实际数据。数据行可以跨越多个数据块。
可用空间区
当插入新数据行或更新数据行需要更多的空间(例如,在前一行的最后一个字段为空(null结束),现在是更新为非空值),并在可用空间区空间(自由空间)将被使用。如果一个数据块(数据块)属于数据段(数据段)的表或簇表,或属于索引的索引段(索引段),然后交易项目也可能存储在它的可用空间区(交易)。如果在一个块中的数据行是行,它被插入,更新访问,删除和选择…对于UPDATE语句,我们需要在这个块中保存事务条目。事务条目所需的存储空间取决于操作系统。在一个普通操作系统中,事务条目需要大约23字节(字节)。
可用空间管理
可用空间可以手动或自动管理。
在数据库中,每个段(段)的可用空间可以自动管理。段中可用的可用空间以位图(位图)的形式记录,这与列表方式中可用块的管理不同。自动段空间管理具有以下优点:
使用起来很容易。它具有更高的空间利用效率,特别是对于具有不同数据容量的每一行(或其他对象)。它能更好地调整多实例行为。在性能/空间利用方面。
用户可以在创建本地托管表空间(本地托管表空间)时选择自动段空间管理功能。
数据块可用空间的可用性与优化
有两种SQL语句可以增加数据块中的可用空间:删除语句和更新现有数据值的UPDATE语句以占据较小的值:
如果INSERT语句与上述两个操作在同一事务(transaction)和位于空间的声明发布后,然后插入语句,可以使用释放空间。如果INSERT语句和不同的东西在自由空间中的语句(如他们是不同用户提交的),然后只有在提交释放空间发表声明后,和插入数据,必须使用数据块,INSERT语句将使用空间。
在数据块中释放的空间(数据块)是不必连续可用空间区(自由空间),Oracle将满足以下条件时将释放空间在自由空间区域:(1)INSERT或UPDATE语句选择一个数据块足够自由的空间来容纳新的数据,(2)但这段自由空间是不连续的,数据不能在连续空间中的数据块写的。只有当上述条件满足,可以Oracle数据块中的可用空间合并,这样可以避免频繁的空间融合和影响数据库的性能。
行链接(行链接)和行迁移(行迁移)
有两种情况导致一行数据的表太大,和一个数据块(数据块)是不能成立的。在第一种情况下,一个数据块不适应当一行数据被插入。在这种情况下,Oracle将这行数据块中的数据链(链)段内。行链接(行链接)通常发生在大数据插入行,如数据行包含一个数据类型的长或LONG RAW列。链接是不可避免的在这个时候。
第二种情况是,原本存储在一个数据块中的数据行(数据块),因为更新操作导致长度增长,和数据块中的可用空间不能满足不断增长的数据行。在这种情况下,Oracle内这行数据(迁移)到新的数据块。Oracle存储一个指向新数据块的位置迁移的数据线位置,迁移数据rowid保持不变。
当数据链路发生(链式)或迁移(迁移)时,访问它会导致I/O性能下降,因为Oracle必须访问更多的数据块(数据块)以从这些数据行获取数据。
PCTFREE,PCTUSED,线链接(行链接)
在手工管理的表空间(手动管理的表空间),用户可以使用PCTFREE和PCTUSED参数的存储管理在一定时期内控制(段)的插入和更新操作,如何使用数据块属于这段(数据块)可用于空间。用户可以也为指标设置PCTFREE参数时创建或修改(索引存储在索引段(索引段))。
PCTFREE参数
PCTFREE参数用于设置至少一个数据(块)储备(储备)多少可用空间(百分比),以备数据量时可能出现更新数据块中的现有数据的增长。例如,一个用户创建一个表时创建表的语句,指定以下参数:
PCTFREE 20
此参数设置每个数据块(数据块)在相应的数据段(数据段)的表至少保持20%的可用空间,以便它可以在更新现有的数据块中使用。只要行数据区域的容量和数据块的头不超过该数据块的总容量的80%,用户可以插入新的数据,并把数据区域的行数据行(行数据区),并将相关信息写入数据块(顶区)。
下面的插图显示了PCTFREE的角色:
PCTUSED参数
的PCTUSED参数是用来决定是否一个数据块(数据块)可以用来插入新数据。基础是数据块的容量(行数据)和数据块(开销)对数据块的总容量比例最大的帐户。当一个数据块中的可用空间比例小于PCTFREE参数,Oracle认为数据块不可用插入新的数据到数据块所占的体积比低于PCTUSED参数。在占有率大于PCTUSED参数,Oracle将只使用可用空间的数据块的数据时,在数据块更新。比如,一个用户创建一个创建表的语句表时,指定以下参数:
PCTUSED 40
在这个例子中,当一个数据块占用容量比为40%以上时,Oracle不会将数据块插入新数据行(假设该数据块的可用空间已低于PCTFREE限制)。
PCTUSED的作用
PCTFREE和PCTUSED如何一起工作
对PCTFREE和PCTUSED共同作用可以优化数据块空间的使用(数据块)。
使用PCTFREE和PCTUSED参数管理数据块的可用空间
上述数字表明,PCTFREE和PCTUSED共同管理数据块空间的使用(数据块)。
在第一步中,当数据块占用的空间比小于80%,新的数据可以插入,因为PCTFREE参数限制20%个自由空间用于块中的现有数据更新。在第二步中,数据块中的保留空间可用于在数据块的数据更新,新的数据只能插入到数据块时,入住率低于40%,在第三步中,当块中的占有率小于40%,数据块可以被用于插入新的数据。在第四步中,当数据块占用的空间比小于80%,新的数据可以插入,因为PCTFREE参数限制,20%的可用空间必须保留块中的现有数据更新。这个过程是如此往复。
在新分配的数据块(数据块),空间可用于插入(INSERT)数据等于数据块减去数据块的总体积(开销),然后减去保留的可用空间(PCTFREE),数据块中的所有可用空间可以由在更新数据块使用现有数据。因此,更新操作可以使PCTFREE限制在可用空间内的数据块,因为这些空间是留给更新操作。
在每个数据段(数据段)和索引段(索引段),Oracle管理一个或更多的可用块列表(自由列表),其中列出了所有属于这个时期的数据扩展(的程度),一个数据块的可用空间大于合格PCTFREE的比例。这些块可以通过使用插入(插入)操作。当用户提交INSERT语句,Oracle选择从可用块列表数据的第一个有效的块,如果数据块的可用空间不够容纳INSERT语句提交的数据,以及块的占用容量已经超过PCTUSED的限制,Oracle将删除它从可用块列表。一段可以使用多个可用标签块列表,同时减少并发插入竞争(并发插入)在桌上。
当用户提交一个DELETE或UPDATE语句,Oracle处理语句并检查是否在相关的数据块占用空间比例小于PCTUSED。如果满意,数据块放在可用块列表的头(自由列表)是被用来在当前事务(交易)。如果当前事务需要写入数据,则将首先使用块。当提交事务时,此数据块中可用的空间也可以由其他事务使用。