ORACLE的逻辑存储体系

时间:2022-01-06 09:05:45

一、ORACLE的逻辑存储体系

      ORACLE的逻辑存储体系包含了表空间(tablespace)、段(segment)、区(extent)、块(block)。

      1.1 表空间

            数据库是由一个或多个表空间组成, 表空间是由一个或多个数据文件组成。

            一个表空间可能包含一个或多个段, 每个段都只属于一个表空间。

      1.2 段

            最常见的四种类型的段有数据段、索引段、临时段和回滚段。创建表时, 会创建一个表段。创建分区表时, 则么个分区会创建一个段。

            段可以有来自多个不同数据文件的区, 也就是说段可以跨越一个表空间内的多个数据文件。

      1.3 区

            区是由一段连续的块组成。区可以是一个ORACLE数据块, 也可以一段连续的块组成。

      1.4 块

            块是ORACLE最小的存储单位, ORACLE请求数据都是以块为单位, 也就是说ORACLE请求数据都是块的整数倍, 如果ORACLE请求的数据量不到一块, ORACLE也会读取整个块。

            块是数据库IO的最小的单位。

            块的格式:  块中存放表的数据和索引的数据, 但是无论存哪种类型的数据, 块的格式都是相同的。块由块头(header)、表目录(table directory)、行目录(row directory)、空余空间(free space)和行数据(row data)五部分组成。

                  块头(header): 存放块的基本信息的, 如: 块的物理地址, 块所属的段的类型(是索引段还是数据段)。

                  表目录(table directory): 存放表的信息, 如果一些表的数据被存放在这个块中, 那么这些表的相关信息将被存放在"表目录"中。

                  行目录(row directory): 如果块中有行数据存在, 那么这些行的信息将被记录在行目录中。 这些信息包括行的地址等。

                  行数据(row data): 是真正存放表数据和索引数据的地方。 这部分空间是已被数据行占用的空间。

                  空余空间(free space): 空余空间是一个块中未使用的区域, 这片区域用于新行的插入和已经存在的行的更新。

            对于块中的*空间, ORACLE提供两种管理方式: 自动管理和手动管理。

                  自动管理: ORACLE使用位图(bitmap)来管理和跟踪数据块,  自动管理管理有下面的好处:

                   a) 易于使用

                   b) 更好地利用空间

                   c) 可以对空间进行实时调整

                   手动管理: 用户可以通过PCTFREE, PCTUSED来调整块中空间的使用。 手工管理方式比较麻烦, 不容易掌握, 容易造成块中空间的浪费。

                   PCTFREE参数用于指定块中必须保留的最小空闲空间百分比。之所以要预留这样的空间, 是因为UPDATE时, 需要这些空间。 如果UPDATE时, 没有空余空间, ORACLE就会分配一个新的块, 这会产生行迁移(ROW migrating)。

                   PCTUSED也是用于设置一个百分比, 当块中已事业能够的空间的比例小于这个百分比的时候, 这个块才被标识为有效状态。 只有有效的块才被允许插入数据。

                   行链接(row chaining): 如果我们往数据库中插入(insert)一行数据, 这行数据很大, 以至于一个数据块存不下一整行, ORACLE就会把一行数据分作几段存在几个数据块中。如果一行数据是普通行, 这行数据能够存在一个数据块中, 如果一行数据是链接行,那么这行数据存放在多哥数据块中。

                   行迁移(row migrating): 数据块中存在一条记录, 用户执行UPDATE更新这条记录, 这个UPDATE操作使这条记录变长, 这时候ORACLE在这个数据块中进行查找, 但是找不到能容下纳下这条记录的空间, 无奈之下, ORACLE只能把整行数据移到一个新的数据快。 原来的数据块中保留一个"指针", 这个"指针"指向新的数据块。被移动的这条记录的ROWID保持不变。            无论是行迁链接还是行迁移, 都会影响数据库的性能。 ORACLE在度读取这样的记录的时候会扫描多个数据块, 执行更多的IO。

 

 

 

         

 

 

 

相关文章