最大程度缓解 DB2 中的磁盘 I/O 争用情况
可通过在文件系统内对数据库的组成部分进行合理安排来最大程度缓解 IBM DB2 数据库中的磁盘 I/O 争用情况。总之,数据库管理员必须降低一个进程等待另一个进程完成其 I/O 请求的可能性。这通常被称为 I/O 等待。
以下建议有助于避免磁盘 I/O 争用情况。
- 对于临时用户表空间,请使用 SMS;对于所有其他表空间,请使用 DMS。
DB2 中有两种类型的表空间存储模型:系统管理的空间 (SMS) 和数据库管理的空间 (DMS)。ESRI 建议将 SMS 表空间用于用户临时表空间,而将 SMS 表空间用于其他表空间,以便获得更好的性能,尤其是在您预计数据会定期增长时。
对于 DB2 9,应该考虑使用数据库的“自动存储”功能以及加入表空间的“自动调整大小”属性。在 DB2 9 中,DMS 表空间可在物理需求增加时提供额外的存储空间。注意:在 DB2 9 中,您需要一个附加的 DB2 全局临时表 (DECLARE GLOBAL TEMPORARY TABLE)。对于每个 DB2 文档,声明全局临时表都需要“SYSADM 或 DBADM 权限”或“对 USER TEMPORARY 表空间具有 USE 权限”。
- 设置缓冲池。
设置缓冲池对于性能来说非常重要。默认情况下,DB2 提供了一个名为 IBMDEFAULTBP 的缓冲池。在 DB2 9 中,默认情况下会将 IBMDEFAULTBP 缓冲池配置为自动调整大小。数据库管理器可以调整该缓冲池的大小以满足工作量的需求。
您应该为每个表空间创建一个单独的缓冲池。应该查看数据库快照以检查缓冲池的物理读取值。缓冲池应该足够大,使得只读取少量的物理值便可获取重绘地图的快照。要确定缓冲池的效率,可计算其缓冲池命中率 (BPHR)。如果可能,某个位置的理想 BPHR 应超过 90%。计算公式如下:
BPHR (%) = (1 - (("Buffer pool data physical reads" + "Buffer pool index physical reads") / ("Buffer pool data logical reads" + "Buffer pool index logical reads"))) * 100
查看缓冲池命中率的另一种方法是使用 SYSIBMADM.BP_HITRATIO 管理视图。该视图可以返回命中率,其中包括所有缓冲池的总命中率、数据命中率、XDA 命中率和索引命中率。SELECT SUBSTR(DB_NAME,1,8) AS DB_NAME, SUBSTR(BP_NAME,1,140) AS BP_NAME, TOTAL_HIT_RATIO_PERCENT, DATA_HIT_RATIO_PERCENT, INDEX_HIT_RATIO_PERCENT, XDA_HIT_RATIO_PERCENT, DBPARTITIONNUM FROM SYSIBMADM.BP_HITRATIO ORDER BY DBPARTITIONNUM
- 建立阈值表大小。
通常,将小表一起存储在同一个表空间中,而将大表单独存储在其自己的表空间中。必须在某个表自身需要表空间之前决定其大小。通常,阈值在一定程度上对应于最大容器大小。能够容纳最大容器的表应该存储在其自己的表空间中。还应考虑接近这一限值的表。索引也遵循相同的策略。按照本身需要表空间以及要归为一组这两种情况来对表和索引进行分组。不要将大型表及其索引或经常访问的表及其索引一起存储在同一个表空间中。如果使用的是 DB2 9,则应考虑加入表空间的“自动存储”属性。
- 按照访问频率存储小表和索引。
根据预期的访问频率来决定要将哪些小表一起存储在同一个表空间中。将经常访问的表存储在一个表空间中,而将不经常访问的表存储在另一个表空间中。这样就可以定位经常访问和不经常访问的表空间的容器。这规则同样也适用于索引。索引也应按访问频率进行划分。建议将 DB2 日志与索引和数据分开存储,使其具有自己的磁盘空间。ESRI 建议将操作系统的核参数 MAXUPROC 值设置为高于默认值,这样,ArcSDE 和 DB2 实例用户拥有的所有进程便可在调用时运行。
- 对于 AIX 操作系统,请禁用 db2set DB2_MMAP_READ 和 db2set DB2_MMAP_WRITE。
ESRI 建议禁用 AIX 的下列变量以提高性能。这些变量可以结合使用,从而使 DB2 能够用多功能的多服务访问平台 (MMAP) 来替代 I/O。这样可避免在将多个进程写入同一文件的不同部分时操作系统出现锁定。默认值是 ON。
db2set DB2_MMAP_READ=OFF db2set DB2_MMAP_WRITE=OFF
- 如果您经常使用版本化编辑,请将 ArcSDE 系统表空间 STATES、STATE_LINEAGES 和 MVTABLES_MODIFIED 表及其索引分开。
ArcSDE 系统表空间存储 ArcSDE sdesetup 命令所创建的 ArcSDE 地理数据库系统表和索引。表空间的数量和放置取决于要使用 ArcSDE 数据库的对象。这些表及其索引的放置由 DBTUNE DATA_DICTIONARY 配置关键字的存储参数控制。DATA_DICTIONARY 关键字专门用于创建 ArcSDE 地理数据库系统表。支持 ArcGIS 应用程序的版本化数据库具有非常活跃的状态树。状态树用于维持对注册为版本的表执行的所有编辑操作的状态。四个 ArcSDE 系统表(STATES、STATE_LINEAGES、MVTABLES_MODIFIED 和 VERSIONS)用于保留已版本化数据库的状态树的事务信息。在活动的版本化数据库中,STATES_LINEAGE 表可以轻松地存储超过一百万条记录,这会占用超过 26 MB 表空间。STATES 表要小得多,大约存储 5,000 条记录,占用约 2 MB 表空间。MVTABLES_MODIFIED 表通常包含大约 50,000 条记录,占用大约 1 MB 表空间。VERSIONS 表通常非常小,行数不到 100,占用大约 64 KB 表空间。对于非常活跃的编辑 ArcGIS 应用程序,STATES、STATE_LINEAGES 和 MVTABLES_MODIFIED 表及其索引需要在独立的表空间中创建并且放置在文件系统中,以便最大程度缓解磁盘 I/O 争用情况。
注意:如果不打算使用版本化数据库,可将 STATE_LINEAGES、STATES 和 MVTABLES_MODIFIED 表及其索引的范围大小减小到 40 KB。在独立的磁盘驱动器上创建两个 5 MB 的表空间 - 一个用于存储表,一个用于存储索引。
- 为栅格表创建足够大的表空间,而为栅格块表 (BLK) 创建独立的表空间。
栅格块表可能非常大。请务必创建大型的独立表空间来存储该表。您可以另外创建一个表空间来存储其余栅格表。为栅格块表创建表空间时,建议使用 64 KB 的范围大小和 32 KB 的页面大小。范围大小指定在写入下一个容器之前要写入容器的页面大小的页数。
警告:范围大小在创建表空间时定义,以后很难进行修改。
- 加载大量数据(如栅格数据)时,将数据库设置为使用循环记录。
循环记录使用一系列日志文件来记录对数据库所做的更改。当环中的最后一个日志文件被填满时,将重新使用第一个文件。由于可以覆盖事务信息,使用循环记录时,将无法进行向前滚动恢复;不过,在数据加载过程中通常不需要进行恢复。循环记录是默认记录模型。如果需要使用向前滚动恢复,请使用存档记录。存档记录不会覆盖日志文件;而是会创建单独的日志来记录自上次备份之后发生的所有事务。请注意,使用存档记录将需要更多的磁盘空间,因为日志文件不会像在循环记录中那样被重复使用。
尽管调整数据库后可缓解磁盘 I/O 争用情况,但有时候仍会陷入死锁状态。有关死锁的信息,请参阅 DB2 数据库中的死锁。