DB2 表空间和缓冲池

简介数据库

对于刚涉足 DB2 领域的 DBA 或将来的 DBA 而言,新数据库的设计和性能选择可能会很使人困惑。在本文中,咱们将讨论 DBA 要作出重要选择的两个方面:表空间和缓冲池。表空间和缓冲池的设计和调优会对 DB2 服务器的性能产生深远的影响,所以咱们将着重讨论这些活动。缓存

在咱们的示例中,咱们将使用 DB2 V8.1 企业服务器版。大多数示例也适用于低级版本。咱们会让您知道某个示例是否只适用于 V8.1。服务器

在 第 1 节中,咱们将从定义表空间的类型开始,并将说明 DB2 如何将数据存储在表空间中。咱们将介绍配置选项并向您介绍建立和管理表空间的整个过程。接下来,咱们将着重讨论 缓冲池,介绍缓冲池是什么以及如何建立和使用它。在 第 2 节中,咱们将结合这两个方面并讨论该如何组织缓冲池和表空间才能得到最佳性能。并发


第 1 节:定义数据库设计

表空间布局

数据库中的全部数据都存储在许多表空间中。能够认为表空间是孩子而数据库是其父母,其中表空间(孩子)不能有多个数据库(父母)。因为表空间有不一样用途,所以根据它们的用途和管理方式将它们分类。根据用途有五种不一样的表空间:性能

目录表空间
每一个数据库只有一个目录表空间,它是在发出 CREATE DATABASE 命令时建立的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。老是在建立数据库时建立该表空间。
常规表空间
常规表空间保存表数据和索引。它还能够保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。若是某些表空间是数据库管理的空间(Database Managed Space,DMS),则能够将表及其索引分别放到单独的常规表空间中。咱们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每一个数据库中必须至少有一个常规表空间。建立数据库时指定该表空间的缺省名为 USERSPACE1。
长表空间
长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还能够存储结构化类型的列或索引数据。若是没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省状况下一个都不建立。
系统临时表空间
系统临时表空间用于存储 SQL 操做(好比排序、重组表、建立索引和链接表)期间所需的内部临时数据。每一个数据库必须至少有一个系统临时表空间。随数据库建立的系统临时表空间的缺省名为 TEMPSPACE1。
用户临时表空间
用户临时表空间存储已声明的全局临时表。建立数据库时不存在用户临时表空间。至少应当建立一个用户临时表空间以容许定义已声明的临时表。用户临时表空间是可选的,缺省状况下一个都不建立。

表空间管理测试

能够用两种不一样的方式管理表空间:fetch

系统管理的空间(SMS)
SMS 表空间由操做系统进行管理。容器被定义成常规操做系统文件,而且是经过操做系统调用访问的。这意味着全部的常规操做系统功能将处理如下内容:操做系统将缓冲 I/O;根据操做系统约定分配空间;若有必要就自动扩展表空间。可是,不能从 SMS 表空间删除容器,而且仅限于将新的容器添加到分区的数据库。前一节中所说明的那三个缺省表空间都是 SMS。
数据库管理的空间(DMS)
DMS 表空间是由 DB2 管理的。能够将容器定义成文件(在建立表空间时将把给定的大小所有分配给它们)或设备。分配方法和操做系统容许多少 I/O,DB2 就能够管理多少 I/O。能够经过使用 altER TABLESPACE 命令来扩展容器。还能够释放未使用的那部分 DMS 容器(从 V8 开始)。

下面是一个示例,向您说明该如何增大容器大小(V7 和 V8 都支持此功能):

ALTER TABLESPACE TS1
RESIZE (FILE '/conts/cont0' 2000,
DEVICE '/dev/rcont1' 2000,
FILE 'cont2' 2000)

 

请注意,只有 V8 才支持将原始容器的大小调整得更小。

如何建立和查看表空间

当您建立数据库时,将建立三个表空间(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。经过使用 DB2 命令窗口(Command Window)或 UNIX 命令行,建立一个名为 testdb 的数据库,链接至该数据库,而后列出表空间:

CREATE DATABASE testdb
CONNECT TO testdb
LIST TABLESPACES

 

下面的 清单 1显示了 LIST TABLESPACES 命令的输出。

清单 1. LIST TABLESPACES 命令的输出

          Tablespaces for Current Database
Tablespace ID                        = 0
Name                                 = SYSCATSPACE
Type                                 = System managed space
Contents                             = Any data
State                                = 0x0000
  Detailed explanation:
    Normal
Tablespace ID                        = 1
Name                                 = TEMPSPACE1
Type                                 = System managed space
Contents                             = System Temporary data
State                                = 0x0000
  Detailed explanation:
    Normal
Tablespace ID                        = 2
Name                                 = USERSPACE1
Type                                 = System managed space
Contents                             = Any data
State                                = 0x0000
  Detailed explanation:
    Normal

 

上面所示的这三个表空间是经过 CREATE DATABASE 命令自动建立的。用户能够经过在该命令中包含表空间说明来覆盖缺省的表空间建立,可是在建立数据库时必须建立一个目录表空间和至少一个常规表空间,以及至少一个系统临时表空间。经过使用 CREATE DATABASE 命令或之后使用 CREATE TABLESPACE 命令,能够建立更多的全部类型的表空间(目录表空间除外)。

容器

每一个表空间都有一个或多个容器。重申一次,您能够认为容器是孩子,而表空间是其父母。每一个容器只能属于一个表空间,可是一个表空间能够拥有许多容器。能够将容器添加到 DMS 表空间,或者从 DMS 表空间中删除容器,并且能够更改容器的大小。只能将容器添加到某个分区中分区数据库上的 SMS 表空间,在添加以前该分区还未给表空间分配容器。添加新的容器时,将启动一个自动的从新均衡操做以便将数据分布到全部容器上。从新均衡操做不会妨碍对数据库的并发访问。

表空间设置

能够在建立表空间时给它们指定许多设置,或者也能够稍后使用 altER TABLESPACE 语句时指定其设置。

页大小(Page size)
定义表空间所使用的页大小。所支持的大小为 4K、8K、16K 和 32K。页大小根据下表限定了可放到表空间中的表的行长度和列数:

表 1. 页大小的含义

页大小 行大小限制 列数限制 最大容量
4 KB 4 005 500 64 GB
8 KB 8 101 1 012 128 GB
16 KB 16 293 1 012 256 GB
32 KB 32 677 1 012 512 GB

表空间最多可包含 16384 个页,所以选择较大的页大小能够增长表空间的容量。

扩展块大小(Extent size)
指定在跳到下一个容器以前将写到当前容器中的页数。存储数据时数据库管理器反复循环使用全部容器。该参数只有在表空间中有多个容器时才起做用。
预取大小(Prefetch size)
指定当执行数据预取时将从表空间读取的页数。预取操做在查询引用所需的数据以前读入这些数据,这样一来查询就没必要等待执行 I/O 了。当数据库管理器肯定顺序 I/O 是适当的,而且肯定预取操做可能有助于提升性能时,它就选择预取操做。
开销(Overhead)和传送速率(Transfer rate)
这些值用于肯定查询优化期间的 I/O 成本。这两个值的测量单位都是毫秒,并且它们应当分别是全部容器开销和传送速率的平均值。开销是与 I/O 控制器活动、磁盘寻道时间和旋转延迟时间相关联的时间。传送速率是将一个页读入内存所必需的时间量。它们的缺省值分别是 24.1 和 0.9。能够根据硬件规格计算这些值。

CREATE TABLESPACE 语句的示例

下列语句将建立一个常规表空间。所讨论的全部设置都是为了进行说明。

CREATE TABLESPACE USERSPACE3
	PAGESIZE 8K
	MANAGED BY SYSTEM
	USING ('d:\\usp3_cont1', 'e:\\usp3_cont2', 'f:\\usp3_cont3')
	EXTENTSIZE 64
	PREFETCHSIZE 32
	BUFFERPOOL BP3
	OVERHEAD 24.1
	TRANSFERRATE 0.9

 

如何查看表空间的属性和容器

指定 LIST TABLESPACES 命令的 SHOW DETAIL 选项将显示其它信息:

LIST TABLESPACES SHOW DETAIL

 

清单 2显示了 USERSPACE1 表空间的输出。缺省状况下,将列出建立数据库时所建立的那三个表空间。

清单 2. LlST TABLESPACES SHOW DETAIL 命令的输出

          Tablespaces for Current Database
Tablespace ID                        = 2
Name                                 = USERSPACE1
Type                                 = System managed space
Contents                             = Any data
State                                = 0x0000
  Detailed explanation:
    Normal
Total pages                          = 336
Useable pages                        = 336
Used pages                           = 336
Free pages                           = Not applicable
High water mark (pages)              = Not applicable
Page size (bytes)                    = 4096
Extent size (pages)                  = 32
Prefetch size (pages)                = 16
Number of containers                 = 1

 

要列出容器,咱们须要使用以上输出中的 Tablespace ID:

LIST TABLESPACE CONTAINERS FOR 2

 

清单 3. LIST TABLESPACE CONTAINERS 命令的输出

            Tablespace Containers for Tablespace 2
 Container ID                         = 0
 Name                                 = C:\\DB2\\NODE0000\\SQL00004\\SQLT0002.0
 Type                                 = Path

 

该命令将列出指定表空间中的全部容器。如上所示的路径指向容器物理上所在的位置。

缓冲池

一个缓冲池是与单个数据库相关联的,能够被多个表空间使用。当考虑将缓冲池用于一个或多个表空间时,必须保证表空间页大小和缓冲池页大小对于缓冲池所“服务”的全部表空间而言都是同样的。一个表空间只能使用一个缓冲池。

建立数据库时,会建立一个名为 IBMDEFAULTBP 的缺省缓冲池,全部的表空间都共享该缓冲池。可使用 CREATE BUFFERPOOL 语句添加更多的缓冲池。缓冲池的缺省大小是 BUFFPAGE 数据库配置参数所指定的大小,可是能够经过在 CREATE BUFFERPOOL 命令中指定 SIZE 关键字来覆盖该缺省值。足够的缓冲池大小是数据库拥有良好性能的关键所在,由于它能够减小磁盘 I/O 这一最耗时的操做。大型缓冲池还会对查询优化产生影响,由于更多的工做可在内存中完成。

基于块的缓冲池
V8 容许您留出缓冲池的一部分(最高可达 98%)用于基于块的预取操做。基于块的 I/O 能够经过将块读入相邻的内存区而不是将它分散装入单独的页,来提升预取操做的效率。每一个缓冲池的块大小必须相同,而且由 BLOCKSIZE 参数进行控制。该值等于块的大小(单位为页),从 2 到 256,缺省值为 32。

扩展存储器
DB2 不将扩展存储器用于缓冲区。可是,能够用扩展存储器来高速缓存内存页,使得从内存移出页变得更快。

CREATE BUFFERPOOL 语句的示例

下面是 CREATE BUFFERPOOL 语句的一个示例:

CREATE BUFFERPOOL BP3
SIZE 2000
PAGESIZE 8K

 

该缓冲池被分配给上面的 CREATE TABLESPACE 示例上的 USERSPACE3,而且在建立表空间以前建立该缓冲池。请注意,缓冲池和表空间的页大小都是 8K,二者是相同的。若是您在建立缓冲池以后建立表空间,则能够省去 CREATE TABLESPACE 语句中的 BUFFER POOL BP3 语法。相反,可使用 altER TABLESPACE 命令将缓冲池添加到现有的表空间:

ALTER TABLESPACE USERSPACE3 BUFFERPOOL BP3

 

如何查看缓冲池属性

经过查询 SYSCAT.BUFFERPOOLS 系统视图能够列出缓冲池信息:

SELECT * FROM SYSCAT.BUFFERPOOLS
BPNAME             BUFFERPOOLID NGNAME             NPAGES      PAGESIZE    ES
------------------ ------------ ------------------ ----------- ----------- --
IBMDEFAULTBP                  1 -                          250        4096 N
  1 record(s) selected.

 

要找出哪一个缓冲池被分配给了表空间,请运行下面这个查询:

SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES
TBSPACE            BUFFERPOOLID
------------------ ------------
SYSCATSPACE                   1
TEMPSPACE1                    1
USERSPACE1                    1
  3 record(s) selected.

 

能够在上一个查询中找到 BUFFERPOOLID,该查询使您可以看到每一个表空间与哪一个缓冲池相关联。

数据库如何保存表空间的可视化图表

既然咱们已经描述了表空间和缓冲池是什么以及如何建立它们,那么就让咱们研究一下有关如何在数据库中将它们直观地组织起来的示例。


图 1. 表空间和缓冲池
图 1

该数据库有 5 个表空间:一个目录表空间、两个常规表空间、一个长表空间和一个系统临时表空间。没有建立用户临时表空间。另外有 8 个容器。

在这个方案中,缓冲池可能以下分配:
将 BP1(4K)分配给 SYSCATSPACE 和 USERSPACE2
将 BP2(8K)分配给 USERSPACE1
将 BP3(32K)分配给 LARGESPACE 和 SYSTEMP1


第 2 节:性能含义

通常而言,在物理设备上设计如何放置表空间和容器时,目标是使 I/O 并行性和缓冲区利用率达到最优。要实现这个目标,应当全面了解数据库设计和应用程序。只有这样您才能肯定相似于下面这样的问题:将两张表分隔到不一样的设备会不会产生并行 I/O,或者,是否应当在单独的表空间中建立表以即可以对它进行彻底缓冲。

设计新数据库的物理布局应当从设计表空间的组织开始:

  1. 第一步是肯定表设计所给出的约束。这些可能会致使必须使用多个常规表空间。
  2. 第二步是考虑若是让表空间中的表具备不一样的设置,是否有可能显著提升性能。
  3. 一旦做出了一个试验性的表空间设计,那么就必须考虑缓冲池的利用率。这可能会使前面的表空间设计产生一些变化。
  4. 最后,必须给表空间分配容器。

这个是一个有反复的过程,应该经过压力测试和基准测试验证该设计。很显然,实现最佳的设计可能须要花费大量精力,而且仅当数据库性能必须多是最佳时才能证实设计是最佳的。一般:

  • 从最简单的可行设计入手。
  • 只有根据测试证实有充分的性能理由时才增长复杂性。

一般,为了下降管理和保持一个较为简单的数据库设计的复杂性,稍微下降一点性能是值得的。DB2 具备一种很是成熟的资源管理逻辑,每每不用进行精心的设计就能产生很是好的性能。

表空间组织

一般应该将目录表空间和系统临时表空间做为 SMS 分配。没有必要拥有多个具备相同页大小的临时表空间,一般只需一个具备最大页大小的临时表空间就够了。

突出的问题在因而否要将用户数据分割到多个表空间中。一个考虑因素是页的利用率。不能将行分割到不一样的页,所以具备长行的表须要有合适的页大小。可是,一个页上的行不能超过 255 个,所以具备较短行的表不能利用整个页。例如,在页大小为 32K 的表空间中放置行长度为 12 字节的表,它大约只能利用每一个页的 10%(即,(255 行 * 12 字节 + 91 字节的开销) / 32k 页大小 = ~10%)。

若是表很大,这只是一个考虑因素,所以浪费的空间就很是大。它还会使 I/O 和缓存的效率下降,由于每一个页的实际有用内容不多。若是能够将表放到具备较小页的表空间中,以及能够充分利用较大的页大小,那么最经常使用的访问方法将肯定哪个更好。若是一般是顺序访问大量行(该表可能进行了群集),那么比较大的页大小会比较有效。若是随机访问行,那么较小的页大小能够容许 DB2 更好地利用缓冲区,由于一样的存储区域能够容纳更多页。

一旦根据页大小对表进行了分组,那么访问频率和类型将肯定把数据进一步分组到独立的表空间中是否有意义。每张表根据本身被最频繁访问的方式,能够具备一组最有效的表空间设置:PAGESIZE、EXTENTSIZE 和 PREFETCHSIZE。上面已介绍了 PAGESIZE。EXTENTSIZE 是在将数据写入到下一个容器以前写入到当前容器中的数据的页数(若是表空间中存在多个容器的话)。

PREFETCHSIZE 指定在执行数据预取时将从表空间读取的页数。当数据库管理器肯定顺序 I/O 是适当的,而且肯定预取操做可能有助于提升性能时,会使用预取操做(一般是大型表扫描)。比较好的作法是将 PREFETCHSIZE 值显式地设置成表空间的 EXTENTSIZE 值与表空间容器数的乘积的倍数。例如,若是 EXTENTSIZE 是 32,而且表空间中有 4 个容器,那么理想的 PREFETCHSIZE 应当是 12八、256 等等。若是一个或多个频繁使用的表须要的这组参数的值不一样于那些最适用于表空间其它表的性能的参数值,那么将这些表放入单独的表空间可能会提升总体性能。

若是预取操做是表空间中的重要因素,那么请考虑留出一部分缓冲区用于基于块的 I/O。块大小应当等于 PREFETCHSIZE。

缓冲池的利用率

使用多个用户表空间的最重要缘由是管理缓冲区的利用率。一个表空间只能与一个缓冲池相关联,而一个缓冲池可用于多个表空间。

缓冲池调优的目标是帮助 DB2 尽量好地利用可用于缓冲区的内存。整个缓冲区大小对 DB2 性能有巨大影响,这是由于大量的页能够显著地减小 I/O 这一最耗时的操做。可是,若是总的缓冲区大小太大,而且没有足够的存储器可用来分配给它们,那么将为每种页大小分配最少的缓冲池,性能就会急剧降低。要计算最大的缓冲区大小,DB二、操做系统以及其它任何应用程序都必须考虑其它全部存储器的利用率。一旦肯定了总的可用大小,就能够将这个区域划分红不一样的缓冲池以提升利用率。若是有一些具备不一样页大小的表空间,那么每种页大小必须至少有一个缓冲池。

拥有多个缓冲池能够将数据保存在缓冲区中。例如,让咱们假设一个数据库有许多频繁使用的小型表,这些表一般所有都位于缓冲区中,所以访问起来就很是快。如今让咱们假设有一个针对很是大的表运行的查询,它使用同一个缓冲池而且须要读取比总的缓存区大小还多的页。当查询运行时,来自这些频繁使用的小型表的页将会丢失,这使得再次须要这些数据时就必须从新读取它们。

若是小型表拥有本身的缓冲池,那么它们就必须拥有本身的表空间,所以大型查询就不能覆盖它们的页。这有可能产生更好的总体系统性能,虽然这会对大型查询形成一些小的负面影响。常常性地进行调优是为了实现总体的性能提升而在不一样的系统功能之间作出的权衡。区分功能的优先级并记住总吞吐量和使用状况,同时对系统性能进行调整,这是很是重要的。

V8 所引入的新功能可以在不关闭数据库的状况下更改缓冲池大小。带有 IMMEDIATE 选项的 altER BUFFERPOOL 语句会马上生效,只要数据库共享的内存中有足够的保留空间能够分配给新空间。可使用这个功能,根据使用过程当中的周期变化(例如从白天的交互式使用转换到夜间的批处理工做)来调优数据库性能。

物理存储器组织

一旦将表分布到多个表空间中,就必须决定它们的物理存储器。表空间能够存储在多个容器中,而且它能够是 SMS 或 DMS。SMS 更容易管理,对于包含许多不一样的小型表的表空间(例如目录表空间),尤为是那些包含 LOB 的表的表空间而言,SMS 多是个不错的选择。为了下降每次一页地扩展 SMS 容器的开销,应当运行 db2empfa命令。这会将数据库配置参数 MULTIPAGE_ALLOC 的值设置成 YES。

DMS 一般有更好的性能,而且它提供了分别地存储索引和 LOB 数据的灵活性。一般应当将一个表空间的多个容器分开存放在单独的物理卷上。这能够提升某些 I/O 的并行性。当有多个用户表空间和多个设备时,应当考虑应用程序逻辑,这样就能够尽量平均地在这些设备上分配工做负载。

RAID 设备有它们本身的特殊考虑。EXTENTSIZE 应该等于 RAID 条带大小或者是它的倍数。PREFETCHSIZE 应该等于 RAID 条带大小乘以 RAID 并行设备数(或者等于该乘积的倍数),这个值应该是 EXTENTSIZE 的倍数。DB2 提供了本身的注册表变量,容许您加强您的特定环境。经过执行下面这个命令,能够在一个容器中启用 I/O 并行性:

db2set DB2_PARALLEL_IO=*

 

另外一个注册表变量 DB2_STRIPED_CONTAINERS=ON 能够将容器标记大小从一个页更改为整个扩展块,所以就能使表空间扩展块和 RAID 条带一致。

至于性能评估的其它方面,要知道某个更改是否有益,惟一稳妥的方法就是进行基准测试。若是物理组织发生了更改,那么执行该任务稍微有些复杂,这是由于这时要更改表空间必需要付出至关大的精力。最实用的方法就是减小设计阶段中的案例数,这样的话稍后须要进行基准测试的案例就比较少了。只有在性能极其重要而且不一样的设计之间有可能存在显著的性能差异时,才值得花时间和精力进行严格的基准测试来比较设计。应当把重点放在缓冲池上,确保没有将它们分配到虚拟内存中,并确保以最有效的方式利用它们。

有关移动数据库的考虑事项

在将数据库移到另外一个系统以前,始终应该从新评估它的调优参数和物理组织,即使这些系统是同一种平台也应如此。在实际状况中,DBA 将通过良好调优的数据库从具备 1 GB 内存的 Windows 服务器复制到具备 256 MB 内存的膝上型计算机中。在服务器上进行链接所花的时间小于一秒,而在膝上型计算机中却要用掉 45 分钟。经过减小缓冲池大小和其它内存参数就能解决这个问题。

若是平台不同,那么这个问题就变得更难了。即便是在 UNIX 和 Windows 之间进行移动,在一个系统上已经是最佳性能,在另外一个系统上却未必如此。若是复制数据库是为了进行生产,那么应当重复调优过程。若是必须将数据库移到 zSeries™,那么这里讨论的某些内容则不适用,而应该参考有关的手册和红皮书。在 iSeries 系统上,物理设置和调优是在数据库环境以外一块儿完成的,应当参考 iSeries™ 系统管理手册。

相关文章
相关标签/搜索