OLTP应用程序的DB2调优技巧
2009-12-12 14:59:20 来源:WEB开发网下面是一些控制锁列表大小的建议:
经常进行提交以释放锁。
当执行大量更新时,更新之前,在整个事务期间锁定整个表(使用 SQL LOCK TABLE 语句)。这只使用了一把锁从而防止其它事务妨碍这些更新,但是对于其他用户它的确减少了数据并发性。
使用 altER TABLE 语句的 LOCKSIZE 参数控制如何在持久基础上对某个特定表进行锁定。
查看应用程序使用的隔离级别。使用可重复读隔离级别在某些情况下可能会导致自动执行表锁定。当有可能减少所持有共享锁的数量时,可以使用游标稳定性(Cursor Stability)隔离级别。如果没有损害应用程序完整性需求,那么可以使用未提交的读隔离级别而不是游标稳定性隔离级别,以进一步减少锁的数量。
使用下列步骤确定锁列表所需的页数:
计算锁列表大小的下限:(512 * 32 * MAXAPPLS) / 4096,其中 512 是每个应用程序平均所含锁数量的估计值,32 是对象(已有一把锁)上每把锁所需的字节数。
计算锁列表大小的上限:(512 * 64 * MAXAPPLS) / 4096,其中 64 是某个对象上第一把锁所需的字节数。
对于您的数据,估计可能具有的并发数,并根据您的预计为锁列表选择一个初始值,该值位于您计算出的上限和下限之间。
使用数据库系统监视器调优 MAXLOCKS 值。
设置 MAXLOCKS 时,请考虑锁列表的大小(LOCKLIST):
MAXLOCKS = 100 * (512 锁/应用程序 * 32 字节/锁 * 2) / (LOCKLIST * 4096 字节)
该样本公式允许任何应用程序持有的锁是平均数的两倍。如果只有几个应用程序并发地运行,则可以增大 MAXLOCKS,因为在这些条件下锁列表空间中不会有太多争用。
LOCKTIMEOUT 指定了应用程序为获取锁所等待的秒数。这有助于应用程序避免全局死锁。
如果将该参数设置成 0,那么应用程序将不等待获取锁。在这种情形中,如果请求时没有可用的锁,那么应用程序立刻会接收到 -911。
如果将该参数设置成 -1,那么将关闭锁超时检测。在这种情形中,应用程序将等待获取锁(如果请求时没有可用的锁),一直到被授予了锁或出现死锁为止。
建议
设置 LOCKTIMEOUT 以快速检测由于异常情形而出现的等待,比如事务被延迟了(可能是由于用户离开了他们的工作站)。将它设置得足够高,这样有效的锁请求就不会因为高峰时的工作负载而超时,在高峰时等待获取锁的时间将延长。
在联机事务处理(OLTP)环境中,这个值从 30 秒开始。在只进行查询的环境中可以从一个更大的值开始。无论哪种情况,都可使用基准测试技术来调优该参数。
如何更改这些参数
要更改锁参数,请运行以下命令: db2 -v update db cfg for DB_NAME using LOCKLIST a_number
db2 -v update db cfg for DB_NAME using MAXLOCKS b_number
db2 -v update db cfg for DB_NAME using LOCKTIMEOUT c_number
db2 -v terminate
研究步骤
一旦锁列表满了,由于锁升级生成更多的表锁和更少的行锁,因此减少了数据库中共享对象的并发性,从而降低了性能。另外,应用程序间可能会发生更多死锁(因为它们都等待数量有限的表锁),这会导致事务被回滚。当数据库的锁请求达到最大值时,应用程序将接收到值为 -912 的 SQLCODE。如果锁升级造成性能方面的问题,则可能需要增大 LOCKLIST 参数或 MAXLOCKS 参数的值。可以使用数据库系统监视器来确定是否发生锁升级,跟踪应用程序(连接)遭遇锁超时的次数,或者数据库检测到的所有已连接应用程序的超时情形。
首先,运行下面这个命令以打开针对锁的 DB2 监视器: db2 -v update monitor switches using lock on
db2 -v terminate
然后收集数据库快照: db2 -v get snapshot for database on DB_NAME
在快照输出中,检查下列各项: Locks held currently = 0
Lock waits = 0
Time database waited on locks (ms) = 0
Lock list memory in use (Bytes) = 504
Deadlocks detected = 0
Lock escalations = 0
Exclusive lock escalations = 0
Agents currently waiting on locks = 0
Lock Timeouts = 0
Internal rollbacks due to deadlock = 0
如果“Lock list memory in use (Bytes)”超过定义的 LOCKLIST 大小的 50%,那么就增加 LOCKLIST 数据库配置参数中的 4KB 页的数量。锁升级、锁超时和死锁将表明系统或应用程序中存在某些潜在问题。锁定问题通常表明应用程序中存在一些相当严重的并发性问题,在增大锁列表参数的值之前应当解决这些问题。
活动应用程序的最大数目(MAXAPPLS)
背景知识
MAXAPPLS 是一个数据库配置参数。它指定了可以连接到数据库的并发应用程序(本地和远程)的最大数量。由于需要给连接到数据库的每个应用程序分配一些私有内存,因此允许有更多并发应用程序将意味着用去更多内存。该参数值必须大于等于已连接应用程序的数量,加上这些相同的应用程序中完成两阶段提交或回滚过程中可能并发存在的数量的总和。
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››db2诊断系列之---定位锁等待问题
- ››db2 命令选项解释
- ››应用程序的配置管理Poco
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 基础: 表空间和缓冲池
- ››DB2 XML 编程,第 1 部分: 理解 XML 数据模型
更多精彩
赞助商链接