2006-4-26 17:24
ericsson
[b]性能含义[/b]
一般而言,在物理设备上设计如何放置表空间和容器时,目标是使 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 应当是 128、256 等等。如果一个或多个频繁使用的表需要的这组参数的值不同于那些最适用于表空间其它表的性能的参数值,那么将这些表放入单独的表空间可能会提高整体性能。
如果预取操作是表空间中的重要因素,那么请考虑留出一部分缓冲区用于基于块的 I/O。块大小应当等于 PREFETCHSIZE。
缓冲池的利用率
使用多个用户表空间的最重要原因是管理缓冲区的利用率。一个表空间只能与一个缓冲池相关联,而一个缓冲池可用于多个表空间。
缓冲池调优的目标是帮助 DB2 尽可能好地利用可用于缓冲区的内存。整个缓冲区大小对 DB2 性能有巨大影响,这是因为大量的页可以显著地减少 I/O 这一最耗时的操作。但是,如果总的缓冲区大小太大,并且没有足够的存储器可用来分配给它们,那么将为每种页大小分配最少的缓冲池,性能就会急剧下降。要计算最大的缓冲区大小,DB2、操作系统以及其它任何应用程序都必须考虑其它所有存储器的利用率。一旦确定了总的可用大小,就可以将这个区域划分成不同的缓冲池以提高利用率。如果有一些具有不同页大小的表空间,那么每种页大小必须至少有一个缓冲池。
拥有多个缓冲池可以将数据保存在缓冲区中。例如,让我们假设一个数据库有许多频繁使用的小型表,这些表通常全部都位于缓冲区中,因此访问起来就非常快。现在让我们假设有一个针对非常大的表运行的查询,它使用同一个缓冲池并且需要读取比总的缓存区大小还多的页。当查询运行时,来自这些频繁使用的小型表的页将会丢失,这使得再次需要这些数据时就必须重新读取它们。
如果小型表拥有自己的缓冲池,那么它们就必须拥有自己的表空间,因此大型查询就不能覆盖它们的页。这有可能产生更好的整体系统性能,虽然这会对大型查询造成一些小的负面影响。经常性地进行调优是为了实现整体的性能提高而在不同的系统功能之间做出的权衡。区分功能的优先级并记住总吞吐量和使用情况,同时对系统性能进行调整,这是非常重要的。
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™ 系统管理手册。
2006-4-26 17:37
ericsson
查看系统当前创建了哪些bufferpools
db2 =>[b] select BPNAME from syscat.bufferpools[/b]
BPNAME
--------------------------------------------------------------------------------------------------------------------------------
BP01
BP02
BP03
BP04
IBMDEFAULTBP
5 record(s) selected.
2006-4-27 13:23
jxufe
[quote]原帖由 [i]ericsson[/i] 于 2006-4-25 17:11 发表
刚刚看了一下,居然没有profile.sh , 是不是 db2profile 啊? 另外,我看在/home/db2inst1/.profile 文件中已经有下面的语句:
if [ -f /home/db2inst1/sqllib/db2profile ]; then
. /home/db2inst1/sql ... [/quote]
对,是db2profile.sh
2006-4-27 13:25
jxufe
举手提个问,一个tablespace 可以关联几个buffpool?
创建sms tablespaces时是否可以将容器指定到两个目录?
[[i] 本帖最后由 jxufe 于 2006-4-27 13:27 编辑 [/i]]
2006-4-27 14:33
ericsson
一个tablespace只能关联到一个bufferpool, 而一个bufferpool 可以关联到多个tablespaces,前提是pagesize还要相同。
2006-4-27 14:34
ericsson
第二个问题: 创建sms tablespaces时可以将容器指定到两个目录
2006-4-27 16:55
jxufe
再向爱立信老师提个问题
如果sms tablespace 建在两个目录下,那可不可以将第三个目录alter tablespace里去作为第三个容器呢?
2006-4-27 17:20
ericsson
[quote]原帖由 [i]jxufe[/i] 于 2006-4-27 16:55 发表
再向爱立信老师提个问题
如果sms tablespace 建在两个目录下,那可不可以将第三个目录alter tablespace里去作为第三个容器呢? [/quote]
爱立信老师 :L 老大,你折杀我也 。 对于你的提问 (我知道你是在拿小题来考小弟:D)
答案:不可以
2006-4-27 18:05
jxufe
再向爱立信老师请教,buffpool有没有大小限制?
2006-5-3 23:47
thrips
db2的总的内存大小有限制。32位系统上不能超过2G。
2006-5-5 12:34
jxufe
[quote]原帖由 [i]thrips[/i] 于 2006-5-3 23:47 发表
db2的总的内存大小有限制。32位系统上不能超过2G。 [/quote]
那64位系统呢?
2006-5-6 21:55
thrips
应该没有这个限制
不过没有实际试过。
2006-5-8 17:48
turbo
还有没有续集啊?
2006-5-15 09:44
ericsson
[quote]原帖由 [i]turbo[/i] 于 2006-5-8 17:48 发表
还有没有续集啊? [/quote]
五一之后一直在瞎忙,马上就继续,多谢支持。
2006-5-18 20:56
beginner-bj
老熊怎么也不继续提问了?
2006-5-18 21:47
jxufe
哈哈,没有续集,怎么提问啊
2006-6-21 16:23
ericsson
来了来了,忙了一段时间,竟扯淡了,继续开始DB2 。。
2006-6-21 16:30
ericsson
IBM DB2 Viper Release Candidate 1 for Linux, UNIX, and Windows information center 出来也有些日子了,知识出现的速度其实并不快,ASE15.0 的文档也都下载了好几个月了,也都没有看。 看来还是自己太懒,唯一值得庆幸的是自己还能够知道惭愧。
[b] IBM DB2 Viper Release Candidate 1 for Linux, UNIX, and Windows information center 的访问地址:[/b]
[url]http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp[/url]
[b]测试版的下载可以从下面的页面中找到,估计安装过程也是非常简单,也就没有做安装测试的欲望了。[/b]
[url]http://www-128.ibm.com/developerworks/cn/db2/viper/index_download.html[/url]
继续DB2的学习。
2006-6-21 17:03
ericsson
[b]数据库对象[/b]
趁着还有20分钟下班,看一下数据库对象。
[b]实例 [/b]
实例 (有时称为 数据库管理器 )是管理数据的 DB2(R) 代码。它控制可对数据执行的操作,并管理分配给它的系统资源。每一个实例都是一个完整的环境。它包含为给定并行数据库系统定义的所有数据库分区。一个实例有它自己的数据库(其它实例不能存取它),并且它的全部数据库分区共享相同的系统目录。它还有独立的安全性,不受同一机器(系统)上其它实例的影响。
[b]数据库 [/b]
关系数据库 将数据表示成表的集合。表由数目已定的 7 列和任意数目的行组成。每个数据库都包括描述数据的逻辑和物理结构的一组系统目录表、包含为数据库分配的参数值的配置文件,以及带有运行事务和可归档事务的恢复日志。
[b]数据库分区组[/b]
数据库分区组 是一个或多个数据库分区的集合。想要为数据库创建表时,首先创建用来存储表空间的数据库分区组,然后创建用来存储表的表空间。
在较早版本的 DB2 UDB 中, 数据库分区组 称为 节点组 。
[b]表空间 [/b]
数据库由称为 表空间 的部件组成。表空间是用来存储表的位置。当创建表时,您可以决定将特定对象(例如,索引和大对象(LOB))数据与其余表数据分开存放。表空间也可以分布在一个或多个物理存储设备上。下图表显示了在表空间之间分布数据时具有的一些灵活性
2006-6-21 17:04
ericsson
表空间驻留在数据库分区组中。表空间定义和属性记录在数据库系统目录中。
将容器分配给表空间。 容器 是分配的物理存储器(例如,文件或设备)。
表空间可以是系统管理空间(SMS)或数据库管理空间(DMS)。对于 SMS 表空间,每个容器都是操作系统的文件空间中的一个目录,由操作系统的文件管理器控制存储空间。对于 DMS 表空间,每个容器或者是固定大小的预分配文件,或者是物理设备(例如,磁盘),由数据库管理器控制存储空间。
[[i] 本帖最后由 ericsson 于 2006-6-21 17:15 编辑 [/i]]
2006-6-21 17:17
ericsson
包含用户数据的表存放在常规表空间中。缺省用户表空间名为 USERSPACE1。系统目录表存放在常规表空间中。缺省系统目录表空间名为 SYSCATSPACE。
包含长型字段数据或大对象数据(例如,多媒体对象)的表存在于大型表空间或常规表空间中。这些列的基本列数据存储在常规表空间中,而长型字段或大对象数据可以存储在相同的常规表空间或指定大型表空间中。
索引可以存储在常规表空间或大型表空间中。
临时表空间 分为系统临时表空间或用户临时表空间。 系统临时表空间 用来存储 SQL 操作(例如,排序、重组表、创建索引和连接表)期间所需的内部临时数据。虽然可以创建任意数目个系统临时表空间,但建议您只使用大多数表所使用的页大小创建一个。缺省系统临时表空间名为 TEMPSPACE1。 用户临时表空间 用来存储已声明全局临时表(已声明全局临时表存储的是应用程序临时数据)。用户临时表空间 不是 在数据库创建时缺省创建的。
2006-6-21 17:19
ericsson
表
关系数据库将数据表示成表的集合。 表 由逻辑排列的行和列数据组成。所有数据库和表数据都被存储在表空间中。表中的数据在逻辑上是相关的,且可以定义表与表之间的关系。可根据数学规则和 关系 运算来查看和处理数据。
表数据是通过“结构化查询语言”(SQL)存取的,SQL 是一种标准化语言,用于在关系数据库中定义和处理数据。应用程序或用户使用 查询 从数据库中检索数据。查询使用 SQL 来创建如下格式的语句
SELECT <data_name> FROM <table_name>
视图
视图 是高效率的数据呈示方法(无需维护数据)。视图不是实际的表,不需要永久存储器。“虚拟表”是即创建即使用的。
视图可以包括它所基于的表中的所有或某些列或行。例如,可以在视图中连接一个部门表和一个职员表,以便可以列出特定部门中的所有职员。
2006-6-21 17:21
ericsson
OK。 下班回家,明天再继续重新温习一下这些知识。
2006-6-24 16:46
jxufe
提问:
1. 如何将db2/aix库迁移到db2/linux上
2. 如果规则表空间的页大小为4K,那么该表空间最大容量是多少? a 32g b 64g c 128g d 256g
[[i] 本帖最后由 jxufe 于 2006-6-24 16:48 编辑 [/i]]
页:
1
[2]
3
4
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.