【IT168 技术】在DB2 V9版本中表空间的管理方式有系统管理表空间(SMS),数据库管理表空间(DMS)和自动存储管理,下面就以表空间的管理方式来介绍DB2的表空间
系统管理空间概述
在SMS(系统管理空间)表空间中,操作系统的文件系统管理器分配和管理用于存储表的空间。该存储模型通常由存储在文件系统空间中的多个文件组成,这些文件表示表对象。用户决定文件的位置、DB2 数据库 Linux 版、UNIX 版和 Windows 版控制它们的名称,而文件系统负责管理它们。通过控制写入每个文件的数据量,数据库管理器均匀地将数据分布到所有表空间容器中。
每个表至少有一个与它相关的 SMS 物理文件。
表空间中的数据按系统中所有容器上的扩展数据块进行条带分割。扩展数据块是对数据库定义的一组连续页。文件扩展名表示该文件中存储的数据的类型。为了在表空间中的所有容器上平均分布数据,表的起始扩展数据块以循环方式分布在所有容器上。如果数据库中包含许多容量较小的表,那么这种扩展数据块分布特别重要。将数据写入多个容器时,建议执行 DB2 条带分割。
在 SMS 表空间中,表的空间大小是按需分配的。分配的空间量取决于multipage_alloc数据库配置参数的设置。如果将此配置参数设置为YES,那么需要空间时将分配完整的扩展数据块(通常包含两页或更多页)。否则,一次分配的空间将为一页。
缺省情况下,启用了多页文件分配功能。multipage_alloc 数据库配置参数值将指示是否已启用多页文件分配功能。
注: 多页文件分配功能不适用于临时表空间。多页文件分配将只影响一个表的数据和索引部分。这意味着 .LF、.LB 和 .LBA 文件并不会一次扩展一个扩展数据块。
系统管理空间设计
SMS 表空间是使用 CREATE DATABASE 命令上或 CREATE TABLESPACE 语句上的 MANAGED BY SYSTEM 选项定义的。当设计SMS表空间时,必须考虑两个关键要素:
表空间的容器:必须指定要用于表空间的容器数。标识要使用的所有容器是非常重要的,因为您不能在创建了 SMS 表空间之后添加或删除容器。当将单个容器中的所有空间都分配给表时,就认为该表空间“已满”,即使其他容器中还有剩余空间。仅当数据库分区中没有任何容器时,才能向该数据库分区中的 SMS 表空间添加容器。在分区数据库环境中,在将新数据库分区添加至 SMS 表空间的数据库分区组时,可以使用 ALTER TABLESPACE 语句将容器添加至新的数据库分区。
用于一个 SMS 表空间的每个容器都标识一个绝对或相对目录名。其中每一个目录都可以位于不同的文件系统(物理磁盘)上。表空间的最大大小可以按以下方法估计:
容器数 * (操作系统支持的最大文件系统大小)
此公式假定有一个唯一的文件系统映射至每个容器,且每个文件系统都具有最大量的可用空间。实际上,情况可能不是这样,表空间最大大小可能小得多。对于数据库对象的大小也有 SQL 限制,它可能影响表空间的最大大小。
注: 定义容器时必须很小心。如果容器上已有文件或目录,将返回一个错误(SQL0298N)。
表空间的扩展数据块大小
扩展数据块大小只能在创建表空间时指定。因为以后不能更改它,因此为扩展数据块大小选择一个适当的值就很重要。
创建表空间时,如果不指定扩展数据块大小,数据库管理器将使用缺省扩展数据块大小来创建表空间,该缺省大小由 dft_extent_sz数据库配置参数定义。此配置参数最初是根据创建该数据库时提供的信息设置的。如果未在CREATE DATABASE命令上指定 dft_extent_sz 参数,那么会将缺省扩展数据块大小设置为32。
要为表空间的容器数和扩展数据块大小选择适当的值,必须了解:
操作系统对逻辑文件系统的大小施加的限制。
例如,某些操作系统有 2GB 的限制。因此,如果想要一个 64GB 的表对象,那么在此类型的系统上将需要至少32个容器。
当创建该表空间时,可以指定位于不同文件系统上的容器,以便增加可以存储在该数据库中的数据量。
在创建表空间时,DB2为该表空间指定的第一个容器中创建第一个表数据文件(SQL00001.DAT),并允许此文件增大至该扩展数据块大小。当它达到此大小之后,数据库管理器将数据写入下一个容器中的 SQL00001.DAT。此过程会继续,直到所有容器都包含 SQL00001.DAT 文件为止,在那时,数据库管理器会返回至第一个容器。此过程(称为条带分割)会继续在容器目录中运行,直到一个容器装满为止(SQL0289N)或操作系统中不再有空间可分配为止(磁盘已满错误)。条带分割也用于索引(SQLnnnnn.INX)、长型字段(SQLnnnnn.LF)、 LOB(SQLnnnnn.LB 和 SQLnnnnn.LBA)以及XML(SQLnnnnn.XDA)文件。
注: 只要任何一个容器已满,SMS 表空间就满了。因此,每个容器具有相同容量的可用空间是很重要的。
为了有助于将数据更加均匀地分布至这些容器中,数据库管理器根据将表标识(以上示例中为 SQL00001.DAT)除以容器数所得的余数来确定首先使用的容器。容器从 0 开始依次编号。
根据DB2对容器进行循环写入的原则,如果您选择实现磁盘条带分割以及DB2条带分割,那么表空间的扩展数据块大小和磁盘的分割大小应该相同,这样会使性能更加优化。
下面以目前常见的RAID5为例来加以说明
在配置RAID时,可以通过存储管理软件指定每块盘的条带(叫做Segment或Strip)。设置了每块盘的条带大小后,就可以计算出一个RAID的条带大小:RAID Strip=Strip*n(Disks)。DB2找表空间的各个容器循环写数据时,是按照Extent大小,当第一个容器写完一个Extent后,到第二个容器继续写,以此类推。如果Extent块大小和RAID条带大小匹配的话,在写数据时只需一次IO就可写到存储,这样性能比较优化。例如:一个包含4d+1p的RAID5阵列,每块磁盘的条带未128kb,则RAID Strip=128KB×4=512KB。如果表空间页大小是16KB,那么可以设置Extent Size=RAID Strip=512KB=512KB/16KB=32页。这样可以在创建表空间时指定Extent的大小。该原则同样适用于DMS表空间