DB2优化(简易版)
预备—monitors ON
db2 "update monitor switches using
lock ON sort ON bufferpool ON uow ON
table ON statement ON"
打开监视开关,获取需要的性能信息
最简单而最见成效的—Bufferpool
缓冲池是内存中的一块存储区域,用于临时读入和更改数据库页(包含表行或索引项)。缓冲池的用途是为了提高数据库系统的性能。从内存访问数据要比从磁盘访问数据快得多。因此,数据库管理器需要从磁盘读取或写入磁盘的次数越少,性能就越好。对一个或多个缓冲池进行配置之所以是调优的最重要方面,是因为连接至数据库的应用程序的大多数数据(不包括大对象和长字段数据)操作都在缓冲池中进行。
缺省情况下,应用程序使用缓冲池 IBMDEFAULTBP,它是在创建数据库时创建的。当 SYSCAT.BUFFERPOOLS 目录表中该缓冲池的 NPAGES 值为 -1 时,DB2 数据库配置参数 BUFFPAGE 控制着缓冲池的大小。否则会忽略 BUFFPAGE 参数,并且用 NPAGES 参数所指定的页数创建缓冲池。
建议对于仅使用一个缓冲池的应用程序,将 NPAGES 更改成 -1,这样 BUFFPAGE 就可以控制该缓冲池的大小。这使得更新和报告缓冲池大小以及其它 DB2 数据库配置参数变得更加方便。
确保可以使用数据库配置中的 BUFFPAGE 参数来控制缓冲池大小之后,将该参数设置成合适的值。根据数据库的大小和应用程序的性质将该参数设置成一个合理的大值,这种做法很安全。通常,该参数的缺省值非常小,可能满足不了要求。
db2 "get snapshot for all bufferpools"
在数据库快照或缓冲池快照的快照输出中,查找下列"logical reads"和"physical reads",这样就可以计算出缓冲池命中率,它可以帮助调优缓冲池:
缓冲池命中率表明数据库管理器不需要从磁盘装入页(即该页已经在缓冲池中)就能处理页请求的时间百分比。缓冲池的命中率越高,使用磁盘 I/O 的频率就越低。按如下计算缓冲池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
这个计算考虑了缓冲池高速缓存的所有页(索引和数据)。理想情况下,该比率应当超过 95%,并尽可能接近 100%。要提高缓冲池命中率,请尝试下面这些方法:
增加缓冲池大小。
考虑分配多个缓冲池,如果可能的话,为每个经常被访问的大表所属的表空间分配一个缓冲池,为一组小表分配一个缓冲池,然后尝试一下使用不同大小的缓冲池以查看哪种组合会提供最佳性能。
如果已分配的内存不能帮助提高性能,那么请避免给缓冲池分配过多的内存。应当根据取自测试环境的快照信息来决定缓冲池的大小。
太小的缓冲池会产生过多的、不必要的物理 I/O。太大的缓冲池使系统处在操作系统页面调度的风险中并消耗不必要的 CPU 周期来管理过度分配的内存。正好合适的缓冲池大小就在"太小"和"太大"之间的某个平衡点上。适当的大小存在于回报将要开始减少的点上。
获得最佳性能的—SQL
一条糟糕的 SQL 语句会彻底破坏一切。一个相对简单的 SQL 语句也能够搞糟一个调整得很好的数据库和机器。对于很多这些语句,天底下(或在文件中)没有 DB2 UDB 配置参数能够纠正因错误的 SQL 语句导致的高成本的情况。
更糟糕的是,DBA 常常受到种种束缚:不能更改 SQL(可能是因为它是应用程序供应商提供的)。这给 DBA 只留下三条路可走:
1. 更改或添加索引
2. 更改群集
3. 更改目录统计信息
健壮的应用程序由成千上万条不同的 SQL 语句组成。这些语句执行的频率随应用程序的功能和日常的业务需要的不同而不同。SQL 语句的实际成本是它执行一次的成本乘以它执行的次数。
每个 DBA 所面临的重大的任务是,识别具有最高"实际成本"的语句的挑战,并且减少这些语句的成本。
通过本机 DB2 Explain 实用程序、一些第三方供应商提供的工具或 DB2 UDB SQL Event Monitor 数据,可以计算出执行一次 SQL 语句所用的资源成本。但是语句执行频率只能通过仔细和耗时地分析 DB2 UDB SQL Event Monitor 的数据来了解。
最佳性能不仅需要排除高成本 SQL 语句,而且需要确保相应的物理基础结构是适当的。当所有的调节旋钮都设置得恰到好处、内存被有效地分配到池和堆而且 I/O 均匀地分配到各个磁盘时,才可得到最佳性能。
不可遗漏的—Lock
这些与锁相关的控制都是数据库配置参数:
LOCKLIST 表明分配给锁列表的存储容量。每个数据库都有一个锁列表,锁列表包含了并发连接到该数据库的所有应用程序所持有的锁。锁定是数据库管理器用来控制多个应用程序并发访问数据库中数据的机制。行和表都可以被锁定。根据对象是否还持有其它锁,每把锁需要 32 个或 64 个字节的锁列表:
需要 64 个字节来持有某个对象上的锁,在这个对象上,没有持有其它锁。
需要 32 个字节来记录某个对象上的锁,在这个对象上,已经持有一个锁。
MAXLOCKS 定义了应用程序持有的锁列表的百分比,在数据库管理器执行锁升级之前必须填充该锁列表。当一个应用程序所使用的锁列表百分比达到 MAXLOCKS 时,数据库管理器会升级这些锁,这意味着用表锁代替行锁,从而减少列表中锁的数量。当任何一个应用程序所持有的锁数量达到整个锁列表大小的这个百分比时,对该应用程序所持有的锁进行锁升级。如果锁列表用完了空间,那么也会发生锁升级。数据库管理器通过查看应用程序的锁列表并查找行锁最多的表,来决定对哪些锁进行升级。如果用一个表锁替换这些行锁,将不再会超出 MAXLOCKS 值,那么锁升级就会停止。否则,锁升级就会一直进行,直到所持有的锁列表百分比低于 MAXLOCKS。MAXLOCKS 参数乘以 MAXAPPLS 参数不能小于 100。
虽然升级过程本身并不用花很多时间,但是锁定整个表(相对于锁定个别行)降低了并发性,而且数据库的整体性能可能会由于对受锁升级影响的表的后续访问而降低。
LOCKTIMEOUT 的缺省值是 -1,这意味着将没有锁超时(对 OLTP 应用程序,这种情况可能会是灾难性的)。许多 DB2 用户用 LOCKTIMEOUT = -1。将 LOCKTIMEOUT 设置为很短的时间值,例如 10 或 15 秒。在锁上等待过长时间会在锁上产生雪崩效应。
首先,用以下命令检查 LOCKTIMEOUT 的值:
db2 "get db cfg for DBNAME"
并查找包含以下文本的行:
Lock timeout (sec) (LOCKTIMEOUT) = -1
如果值是 -1,考虑使用以下命令将它更改为 15 秒(一定要首先询问应用程序开发者或供应商以确保应用程序能够处理锁超时):
db2 "update db cfg for DBNAME using LOCKTIMEOUT 15"
同时应该监视锁等待的数量、锁等待时间和正在使用锁列表内存(lock list memory)的量。请发出以下命令:
db2 "get snapshot for database on DBNAME"
如果 Lock list memory in use (Bytes) 超过所定义 LOCKLIST 大小的 50%,那么在 LOCKLIST 数据库配置中增加 4k 页的数量。
掩盖问题的—SORTHEAP
SORTHEAP 是一个数据库配置参数,它定义了私有排序所使用的私有内存页的最大数目,或共享排序所使用的共享内存页的最大数目。如果排序是私有排序,那么该参数影响代理程序私有内存。如果排序是共享排序,那么该参数影响数据库的共享内存。每个排序都有单独的由数据库管理器按需分配的排序堆。在排序堆中对数据进行排序。如果由优化器来指导排序堆大小的分配,那么用优化器提供的信息来分配的排序堆的大小要小于由该参数所指定的排序堆大小。
SHEAPTHRES 是一个数据库管理器配置参数。私有和共享排序所使用内存的来源不一样。共享排序内存区的大小是在第一次连接到数据库时根据 SHEAPTHRES 值以静态方式预先确定的。私有排序内存区的大小是不受限制的。对于私有排序和共享排序,应用 SHEAPTHRES 参数的方式不同:
对于私有排序,SHEAPTHRES 是对私有排序在任何给定的时间可以消耗的全部内存的实例级"软"限制。当实例的总私有排序内存消耗量达到这一限制时,为其它进入的私有排序请求而分配的内存会大大减少。
对于共享排序,SHEAPTHRES 是对共享排序在任何给定的时间可以消耗的全部内存的数据库级"硬"限制。当达到这一限制时,不允许有其它共享排序内存请求,直到总的共享内存消耗量回落到 SHEAPTHRES 所指定的限制以下。
使用排序堆的操作示例包括内存中表的散列连接和操作。阈值的显式定义防止数据库管理器将过多数量的内存用于大量排序。
建议
使用数据库系统监视器来跟踪排序活动。
使用合适的索引使排序堆的使用降到最低。
当需要频繁进行大型排序时,增加 SORTHEAP 的值。
如果增加 SORTHEAP,请确定是否还需要调整数据库管理器配置文件中的 SHEAPTHRES 参数。
优化器用排序堆大小来确定存取路径。在更改该参数后请考虑重新绑定应用程序(使用 REBIND PACKAGE 命令)。
理想情况下,应当将排序堆阈值(SHEAPTHRES)参数合理地设置为在数据库管理器实例中设置的 SORTHEAP 参数最大值的倍数。该参数至少应当是实例中任何数据库所定义的最大 SORTHEAP 的两倍。
如何更改这些参数
要更改 SORTHEAP 和 SHEAPTHRES 的值,请运行以下命令:
-- SORTHEAP should be changed for individual database --
db2 "update db cfg for DB_NAME using SORTHEAP a_value"
-- SHEAPTHRES is a database manager parameter --
db2 "update dbm cfg using SHEAPTHRES b_value"
研究步骤
OLTP 应用程序不应该执行大型排序。大型排序在 CPU 和 I/O 资源方面的成本太高了。通常,SORTHEAP 大小的缺省值(256 个 4KB 页)就足够了。事实上,对于高并发性 OLTP,可能希望降低这个缺省值。当需要进一步研究时,可以发出下面这条命令:
db2 "update monitor switches using sort on"
然后,让应用程序运行一会,然后输入:
db2 "get snapshot for database on DBNAME"
根据该输出,可以计算每个事务的排序数目,并可以计算溢出了可用于排序的内存的那部分排序的百分比。
SortsPerTransaction
= (Total Sorts) / (Commit statements attempted + Rollback statements attempted)
PercentSortOverflow
= (Sort overflows * 100 ) / (Total sorts)
经验:如果 SortsPerTransaction 大于 5,它可能表明每个事务的排序太多。如果 PercentSortOverflow 大于 3%,那么可能发生了严重的、未曾预料到的大型排序。发生这种情况时,增加 SORTHEAP 只会隐藏性能问题 - 却无法修正它。这个问题的正确解决方案是通过添加正确的索引改进有问题的 SQL 语句的存取方案。
分享到:
相关推荐
### DB2优化技巧详解 #### 一、避免全表扫描 在DB2中,全表扫描是指数据库系统读取整个表的数据来进行查询的过程。这种方式效率极低,尤其是在处理大型数据库时,可能导致性能瓶颈。以下是一些减少全表扫描的方法...
### DB2 优化详解 #### 一、DB2性能优化概览 DB2是IBM公司推出的一款关系型数据库管理系统(RDBMS),广泛应用于各种规模的企业级应用中。随着业务量的增长,DB2数据库的性能问题逐渐成为关注焦点。本文旨在探讨DB2...
### DB2优化说明 #### DB2管理与优化概述 DB2是IBM开发的一款关系型数据库管理系统,被广泛应用于企业级应用环境中。随着业务需求的增长和技术的发展,DB2系统的性能优化变得越来越重要。本文档旨在介绍DB2 UDB V8...
### IBM DB2优化方法 #### 数据库设计 在进行IBM DB2数据库的设计时,需要考虑以下几个方面来确保数据库能够高效地运行。 ##### 表空间 表空间是DB2中的一个非常重要的概念,它用于存储数据库中的数据和索引。...
【DB2优化技巧详解】 DB2数据库管理系统是IBM公司的一款高效、可靠的企业级数据库解决方案,广泛应用于各种在线交易处理(OLTP)和电子商务系统。针对DB2的性能优化至关重要,以下是一些关键的优化技巧,旨在提升DB2...
DB2优化器是IBM DB2数据库管理系统中用于优化SQL查询执行计划的核心组件。优化器的主要目标是找到消耗资源最少且效率最高的执行计划。DB2优化器的问题诊断对于高级数据库管理员和DB2使用者来说尤为重要,因为它能...
了解如何调整这些缓冲池的大小、监控缓冲池的命中率,以及如何设置DB2的内存分配策略,都是DB2优化的重要部分。 4. **并发控制**:在多用户环境下,DB2使用事务和锁机制来保证数据的一致性。学习如何处理死锁、理解...
### DB2优化技巧详解 #### 一、DB2优化背景及意义 在当前的企业级应用环境中,数据库系统作为数据处理的核心部分,其性能直接影响到整个业务系统的运行效率。IBM的DB2作为一款成熟且功能强大的关系型数据库管理...
根据给定文件的信息,我们可以提炼出关于DB2优化的关键知识点,并对其进行详细解释: ### DB2优化技巧概述 DB2作为一款高性能的关系型数据库管理系统,在实际应用中常常需要进行调优以满足不同业务场景的需求。...
Best Practices for DB2(DB2优化_english)
### 数据库优化让数据库飞起来:十大DB2优化技巧 #### 一、开启DB2监控开关,确保系统稳定运行 为了确保DB2数据库系统的稳定运行并及时获取必要的系统信息,可以开启DB2的监控开关。这包括但不限于锁、排序、缓冲...
db2 性能优化方面的超详细资料,包括性能监控的各种方法,监控工具,调优方法,另附一个...这是我在IBM实习时自己整理的db2优化资料。里面的.odt文档需要下载一个兼容模式才可打开。但是真的是很好的db2 优化学习资料
### DB2优化器详解 #### 引言 DB2优化器是IBM DB2数据库管理系统的核心组件,负责分析SQL语句并生成高效的访问计划,确保数据的快速检索与更新。优化器的功能强大,能够显著提升数据库的性能,尤其在处理复杂查询...
DB2性能优化指南 db2性能优化是 database管理员和开发人员面临的一大挑战。该文档旨在提供DB2性能优化的指南,帮助用户提高DB2数据库的性能。下面是DB2性能优化的要点: 1. 缓冲池配置:缓冲池是DB2数据库中的一...
### DB2性能优化详解 #### 一、引言 在数据库管理系统(DBMS)领域,IBM的DB2作为一款成熟且广泛使用的解决方案,在诸多业务场景中扮演着关键角色。随着数据量的增长和技术的发展,如何有效提升DB2的性能成为了许多...
CPU是决定DB2性能的关键组件之一,特别是DB2优化器(Optimizer)的选择和访问计划(Access Plan)的生成过程。 1. **DB2优化器(Optimizer)** - **功能**: 优化器负责选择执行SQL语句的最佳路径。 - **过程**: SQL语句...
这些信息对于DB2优化器至关重要,因为它依赖这些统计信息来生成最有效的执行计划,确保SQL查询高效运行。 2. **何时需要Runstats**: - 创建或修改索引后,应执行Runstats,以使优化器了解新索引的存在。 - 表...