在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表空间
数据库管理表空间
在 DMS(数据库管理空间)表空间中,数据库管理器控制存储空间。存储模型由有限数目的设备或文件组成,这些设备或文件的空间由 DB2 数据库 Linux 版、UNIX 版和 Windows 版来管理。数据库管理员决定使用哪些设备和文件,而 DB2® 管理这些设备和文件上的空间。这种表空间实质上实现了一种特殊用途的文件系统,用于最好地满足数据库管理器的需要。
DMS 表空间与 SMS 表空间之间的差异在于,对于 DMS 表空间,空间是在创建表空间时分配的。对于 SMS 表空间,空间是根据需要分配的。包含用户定义的表和数据的 DMS 表空间可以定义为存储任何表数据或索引数据的常规表空间或大型表空间。
在设计 DMS 表空间和容器时,应该考虑下列事项:
常规表空间最多可包含 16384 个页,因此选择较大的页大小可以增加表空间的容量,详见下表
页大小 行大小限制 列数限制 最大容量
4 KB 4005 500 64 GB
8 KB 8101 1012 128 GB
16 KB 16293 1012 256 GB
32 KB 32677 1012 512 GB
而大型表空间的最大大小是 16TB,大型表空间只被DMS支持。
与 SMS 表空间不同,组成一个 DMS 表空间的容器不必大小相同;然而,通常不建议这样做,因为会导致在容器间不均匀地进行条带分割,并会降低性能。若任何容器已满,DMS 表空间会使用其他容器中的可用空间。
因为空间是预分配的,所以在能够创建表空间之前,该空间必须是可用的。当使用设备容器时,该设备也必须有足够的空间以便存储容器定义。每个设备上只能定义一个容器。为避免浪费空间,设备的大小应该等于容器的大小。例如,如果分配给该设备 5000 页,而将设备容器定义为分配 3000 页,那么设备上的 2000 页将是不可用的。
在缺省情况下,每个容器中都保留一个扩展数据块作为开销。只使用整个扩展数据块,因此为了对空间进行最优管理,可以使用如下公式来帮助您确定当分配容器时要使用的适当大小:
extent_size * (n + 1)
其中,extent_size 是表空间中每个扩展数据块的大小,而n是您要在该容器中存储的扩展数据块数目。
DMS 表空间的最小大小是五个扩展数据块。试图创建小于五个扩展数据块的表空间将产生错误(SQL1422N)。
表空间中有三个扩展数据块是保留给开销使用的。
要存储任何用户表数据,至少需要两个扩展数据块。(这些扩展数据块是一个表的规则数据所必需的,但不是任何索引、长型字段或大对象数据所需的,它们需要自己的扩展数据块。)
设备容器必须使用带“字符型特殊接口”的逻辑卷,而不是物理卷。
注:虽然很多资料上都声称裸设备性能好,但随着CIO/DIO的发展,文件类型的性能与裸设备计划相差无几,而且文件类型逼裸设备管理起来方便很多,因此在DMS表空间中建议使用文件类型来代替裸设备。
如果工作负载涉及到 LOB 或 LONG VARCHAR 数据,那么可通过文件系统高速缓存改进性能。
注: 数据库管理器的缓冲池不缓冲LOB和LONG VARCHAR。 与 SMS 表空间相似,DMS 文件容器可以利用文件系统预取和高速缓存。但是,使用原始设备容器的DMS表空间却不能。
某些操作系统允许拥有大小超过 2GB 的物理设备。应该考虑将物理设备划分为多个逻辑设备,以使任何容器都不超过操作系统允许的大小。
这一关于页在存储器中的连续放置的一般性陈述有一个例外。当使用DMS表空间时,有两个容器选项:原始设备和文件。当使用文件容器时,数据库管理器在创建表空间时分配整个容器。这种一开始就分配整个表空间的结果是,即使由文件系统执行分配,物理分配也通常(但不保证)是连续的。当使用原始设备容器时,数据库管理器控制整个设备,并始终确保扩展数据块中的页是连续的。
当使用 DMS 表空间时,您应考虑将每个容器与不同的磁盘相关联。这使表空间容量可以更大,并且能够利用并行 I/O 操作。
CREATE TABLESPACE 语句在数据库中创建新的表空间,向表空间分配容器,并在目录中记录表空间定义和属性。当创建表空间时,扩展数据块大小被定义为许多连续页。扩展数据块是表空间中的空间分配单位。只有一个表或对象(例如,索引)能够使用任何一个扩展数据块中的页。将逻辑表空间地址映射中的扩展数据块分配给表空间中创建的所有对象。扩展数据块分配通过“空间映射页”(SMP)进行管理。
逻辑表空间地址映射中的第一个扩展数据块是包含内部控制信息的表空间的头部。第二个扩展数据块是表空间的“空间映射页”(SMP)的第一个扩展数据块。SMP 扩展数据块以固定间隔方式分布在表空间中。每个 SMP 扩展数据块都是当前 SMP 扩展数据块到下一 SMP 扩展数据块的扩展数据块位映射。位映射用来跟踪正在使用哪些中间扩展数据块。
SMP 后面的一个扩展数据块是表空间的对象表。对象表是一个内部表,它跟踪表空间中存在哪些用户对象,以及它们的第一个“扩展数据块映像页”(EMP)扩展数据块的位置。每个对象都有其自己的 EMP,它提供了指向该对象的每一页的映射,这些映射存储在逻辑表空间地址映射中。下图说明了如何在逻辑表空间地址映射中分配扩展数据块。
自动存储表空间
在 DB2 V9 中,自动存储已经变为数据库的默认选项,数据库在创建时会默认启用自动存储,除非显式的改变该选项.自动存储在保持了性能的同时大大的简化了 DBA 的工作,DBA 可以在数据库级别管理表空间的存储,表空间容器选择分配等工作由数据库管理器自动完成。自动存储看起来是一种不同类型的表空间,但实际上是 DMS 和 SMS 的扩展.因为数据库管理的空间 DMS 需要比较多的维护,在 DB2 V8.2.2 中引入了 DMS 自动存储,以简化表空间管理.这种类型的表空间既保持了 DMS 的高性能又具有 SMS 表空间易于管理的特点,可以大大简化 DBA 的管理工作.自动存储需要首先在数据库级别启用,在 DB2 V9 以后,自动存储已经成为了 DB2 的默认设置,在建立数据库时,DBA 可以提供一组路径,在建立表空间时,数据库管理器会在这些提供的路径中建立需要的容器,容器的大小根据情况由数据库管理器负责分配和管理.相比 DMS 而言,自动存储表空间在容器管理方面十分简便,可以满足大多数表空间的使用需求.
借助自动存储器表空间,数据库管理器将根据需要自动创建和扩展容器,直到达到与数据库相关联的存储器路径所确定的限制为止。
如果对数据库启用自动存储器,那么除非您另有指定,否则您创建的任何表空间也将作为自动存储器表空间被管理。有了自动存储器表空间,您就不需要提供容器定义;数据库管理器将负责创建和扩展容器,以便利用分配给数据库的存储器。如果对数据库添加了存储器,那么当现有容器达到它们的最大容量时,将自动创建新容器。如果您希望立即使用新添加的存储器,那么可以对表空间进行重新平衡,从而在扩充后的这组新容器和分割集之间重新分配数据。或者,如果您不怎么关心 I/O 并行性,而只希望对表空间添加容量,那么可以提前进行重新平衡;在这种情况下,当需要新的存储器时,将创建新分割集。
DB2表空间的不同用途
1.目录表空间
每个数据库只有一个目录表空间,它是在发出 CREATE DATABASE 命令时创建的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。总是在创建数据库时创建该表空间。
2.常规表空间
常规表空间保存表数据和索引。它还可以保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。如果某些表空间是数据库管理的空间(Database Managed Space,DMS),则可以将表及其索引分别放到单独的常规表空间中。我们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每个数据库中必须至少有一个常规表空间。创建数据库时指定该表空间的缺省名为 USERSPACE1。
3.长表空间
长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还可以存储结构化类型的列或索引数据。如果没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省情况下一个都不创建。
4.系统临时表空间
系统临时表空间用于存储 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的缺省名为 TEMPSPACE1。
5.用户临时表空间
用户临时表空间存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,缺省情况下一个都不创建。