对于刚涉足 DB2 领域的 DBA 或将来的 DBA 而言,新数据库的设计和性能选择可能会很使人困惑。在本文中,咱们将讨论 DBA 要作出重要选择的两个方面:表空间和缓冲池。表空间和缓冲池的设计和调优会对 DB2 服务器的性能产生深远的影响,所以咱们将着重讨论这些活动。缓存
在咱们的示例中,咱们将使用 DB2 V8.1 企业服务器版。大多数示例也适用于低级版本。咱们会让您知道某个示例是否只适用于 V8.1。服务器
在 第 1 节中,咱们将从定义表空间的类型开始,并将说明 DB2 如何将数据存储在表空间中。咱们将介绍配置选项并向您介绍建立和管理表空间的整个过程。接下来,咱们将着重讨论 缓冲池,介绍缓冲池是什么以及如何建立和使用它。在 第 2 节中,咱们将结合这两个方面并讨论该如何组织缓冲池和表空间才能得到最佳性能。并发
回页首app
数据库中的全部数据都存储在许多表空间中。能够认为表空间是孩子而数据库是其父母,其中表空间(孩子)不能有多个数据库(父母)。因为表空间有不一样用途,所以根据它们的用途和管理方式将它们分类。根据用途有五种不一样的表空间:性能
能够用两种不一样的方式管理表空间:fetch
下面是一个示例,向您说明该如何增大容器大小(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 命令的输出。
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 语句时指定其设置。
页大小 | 行大小限制 | 列数限制 | 最大容量 |
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 个页,所以选择较大的页大小能够增长表空间的容量。
下列语句将建立一个常规表空间。所讨论的全部设置都是为了进行说明。
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 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,该查询使您可以看到每一个表空间与哪一个缓冲池相关联。
既然咱们已经描述了表空间和缓冲池是什么以及如何建立它们,那么就让咱们研究一下有关如何在数据库中将它们直观地组织起来的示例。
该数据库有 5 个表空间:一个目录表空间、两个常规表空间、一个长表空间和一个系统临时表空间。没有建立用户临时表空间。另外有 8 个容器。
在这个方案中,缓冲池可能以下分配:
将 BP1(4K)分配给 SYSCATSPACE 和 USERSPACE2
将 BP2(8K)分配给 USERSPACE1
将 BP3(32K)分配给 LARGESPACE 和 SYSTEMP1
回页首
通常而言,在物理设备上设计如何放置表空间和容器时,目标是使 I/O 并行性和缓冲区利用率达到最优。要实现这个目标,应当全面了解数据库设计和应用程序。只有这样您才能肯定相似于下面这样的问题:将两张表分隔到不一样的设备会不会产生并行 I/O,或者,是否应当在单独的表空间中建立表以即可以对它进行彻底缓冲。
设计新数据库的物理布局应当从设计表空间的组织开始:
这个是一个有反复的过程,应该经过压力测试和基准测试验证该设计。很显然,实现最佳的设计可能须要花费大量精力,而且仅当数据库性能必须多是最佳时才能证实设计是最佳的。一般:
一般,为了下降管理和保持一个较为简单的数据库设计的复杂性,稍微下降一点性能是值得的。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™ 系统管理手册。