科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2 数据库设计:取得最佳性能的准则

DB2 数据库设计:取得最佳性能的准则

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在开发过程的早期作出的很多设计决定对 DB2 应用程序和数据库的性能有着巨大的影响。本文为在 z/OS 环境中取得更好的性能提供了一些一般性的指南和建议。

作者:Fred Whitlark 来源:论坛整理 2007年11月17日

关键字: DB2

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共5页)

数据压缩

  DB2 提供了压缩一个表空间或分区中的数据的能力。这是通过在 CREATE TABLESPACE 语句中指定 COMPRESS YES 选项,然后对表空间执行 LOAD 或 REORG 实用程序来实现的。通过用较短的字符串替换经常出现的长字符串,可以压缩数据。这时会建立一个字典,其中包含了映射原始的长字符串与它们的替换值的信息。

  在数据被存储之前压缩数据,以及在从外部存储设备读出数据时将数据解压,这都需要使用一定的 CPU 资源。但是,数据压缩也可以为性能带来好处,因为可以在更少的空间(包括 DASD 和缓冲池中的空间)中存储更多的数据,与未压缩的数据相比,这样可以减少同步读,减少 I/O 等。

  在决定是否压缩一个表空间或分区时,要考虑下面一些事情:

  行的长度: 行的长度越大(尤其是它接近页宽时),压缩的效率就越低。在 DB2 中,行不能跨页,您可能无法实现足够的压缩来使一页可以容纳多行。

  表的长度: 对于更大的表空间,压缩更为有效。对于非常小的表,压缩字典的大小(8 KB 到 64 KB)有可能会抵消掉通过压缩所节省出来的空间。

  数据中的模式: 对于特定的表空间或分区,数据中重复出现的模式的出现频率将决定压缩的效果。有大量重复字符串的数据有巨大的压缩潜力。

  对压缩的估计: DB2 提供了一个独立的实用程序 DSN1COMP,通过执行该实用程序可以判断压缩数据的效果。要了解关于运行该实用程序的更多信息,请参考 DB2 Utilities Guide and Reference 手册。

  处理成本: 压缩和解压数据时,要消耗一定的 CPU 资源。与使用 DB2 软件模拟程序相比,使用 IBM 的同步数据压缩硬件可以大大减少所消耗的 CPU 资源(当 DB2 启动时,它将判断硬件压缩特性是否可用)。

  更好的字典: 当使用 LOAD 实用程序来建立压缩字典时,DB2 使用所装载的前 n 行(其中 n 取决于数据的压缩程度)来决定字典的内容。REORG 使用一种抽样技术来建立字典。它不仅使用所装载的前 n 行,而且还会对该实用程序执行期间剩下的 UNLOAD 阶段中的行进行抽样。因此,REORG 常常可以产生更能代表整个表空间或分区中的数据的字典。

  如果您的环境可以从压缩中得到好处,通常我们建议压缩那些 DB2 表空间和分区,因为由于更少空间容纳更多数据所带来的性能优势几乎总是大于压缩和解压数据时所需的 CPU 资源消耗。

  装载大型的表

  当处理大量的数据时,一开始将数据装载到表中时可能会遇到性能问题。为了在装载过程中实现并行性,可以手动地创建多个 LOAD 任务,每个分区对应一个任务,或者,也可以在单个 LOAD 实用程序中装载多个分区。每个分区都展开在 I/O 子系统上,从而更易于达到最佳的并行度。

  为了获得最佳性能,在 LOAD 语句中指定 SORTKEYS 参数也很重要。这将指示 DB2 将索引键传递给内存中的排序程序,而不是再次将这些键写到 DASD 上的排序工作文件中,然后从中读取这些键。SORTKEYS 还允许装载和排序之间的重叠,因为排序是作为一个单独的任务运行的。

  下面给出了关于装载大型表的其他建议:

  1、一次只 LOAD 一个表。
  2、如果可能,为那些预计将历时最长的任务提供较高的优先级。
  3、将工作分布在 sysplex 上。

  将辅助索引拆分成数块,以实现并行性(请参阅下面题为 PIECESIZE 的讨论)。
在开始装载数据时,指定 LOG NO (用以防止日志记录,以及节省日志记录所消耗的大量资源),然后在成功装载数据之后运行一个映像拷贝。

  空余空间方面的考虑

  分配空余空间的主要目的是使数据行的物理顺序与群集索引一致,以减少频繁重组数据的需要。此外,对行的更好的群集会使读访问的速度更快,行插入的速度也更快。然而,过多地分配空余空间可能会产生浪费的 DASD 空间,导致每次 I/O 只能传输更少的数据,缓冲池的利用效率更低,并且要扫描更多的页。

  表空间和索引中空余空间的分配是由 CREATE 或 ALTER TABLESPACE 以及 CREATE 或 ALTER INDEX 语句的 PCTFREE 和 FREEPAGE 选项确定的。

  PCTFREE 告诉 DB2 在装载或重组数据时,表空间或索引中的每个页要留出多少百分比的空余空间。如果没有足够的空余空间来按照 恰当的顺序(也就是按群集顺序)编写行或索引,那么 DB2 就必须将多出的数据放到另一个页上。当越来越多的记录被乱序存放时,性能就会出现问题。

  FREEPAGE 告诉 DB2 在装载或重组数据时,应该过多久就分配一整页的空余空间。例如,如果指定了 FREEPAGE 5,那么 DB2 将在用数据填充了 5 个页之后分配一页的空余空间。如果表行大于页宽的一半,则应该使用 FREEPAGE,因为在那样的环境下不能在一页上再 INSERT 一行。

  是否定义带空余空间的表空间,以及分配多少的空余空间,这很大程度上取决于表空间中表的 INSERT 特征(其次是 DELETE 活动)。换句话说,这取决于将行添加到表中的频率,以及将行添加到表的什么地方。下面有 4 种类别:

  只读表: 如果对于一个表没有任务更新活动,那么可以将其定义为没有空余空间。而且,也没有任何必要去运行 REORG 实用程序。

  随机插入: 对于已经有很多行、并且 INSERT 活动的级别很低,那么一开始可以使用默认的 PCTFREE(对于表空间,该值是 5,对于索引,该值是 10)。然后使用 RUNSTATS 监控数据失序的程度,再考虑您期望运行 REORG 的频率,对 PCTFREE 进行必要的上下调整。对于 INSERT 活动级别很高的表,可能需要使用大于默认值的 PCTFREE。对于开始为空或者只包含很少行的表(例如在新数据库的部署期间),可能需要指定一个较高的 PCTFREE,并不时地运行一下 REORG,直到这个表被填充好为止。

  在表的末尾插入: 如果一个表中的行的长度不会增长,那么就无需分配空余空间,因为这些行是在表的末尾插入的。由于这些行是按照物理的群集顺序来写的,因此不需要运行 REORG。但是,如果一个表包含可更新的 VARCHAR 列,或者该表被压缩,那么有可能行的长度会增长,从而导致某一行被转移到其他页上。您可以通过对表空间执行 RUNSTATS,然后检查 DB2 编目表 SYSIBM.SYSTABLEPART 的 NEARINDREF 和 FARINDREF 这两列来判断上述情况。如果表变得缺乏组织,那么为表空间指定一个 PCTFREE,并继续用 RUNSTATS 监控 位置不当(mislocated)的行。根据当前的数据以及您所观察到的趋势,对 REORG 的频率和 PCTFREE 的数字进行相应的调整。通过在 REORG TABLESPACE 中指定 INDREFLIMIT 和 REPORTONLY 选项,可以监控被更新的 DB2 表中位置不当的行的数目,以及隔多远会出现这样的行。

  在 热点(hot spot)中插入 :在这种情况下,表上的插入活动很频繁,而且集中在某一个位置(或几个位置),而不是在表的末尾进行插入。这一类情况可能是最难于处理的。可以尝试增加 PCTFREE 的值。如果插入活动停留在主段(home segment)中,并且插入的行不是很长,那么可以将数行存储在相同的页中。在此情况下,另一种可以考虑的方案是使用 FREEPAGE。这时有必要严密监控表变得无组织的速度,这样就可以在性能急剧下降之前运行 REORG。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章