一台DB2数据库,近期交易总是锁表,报错如下:
- DB2 SQL Error: SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68, DRIVER=3.62.56
一般报 SQLCODE=-911的错误时,我们优先就会想到是不是索引问题,但这次从日志中看,报错时间点的数据库更新并不频繁,也没有对同一张表的同一行做UPDATE操作,而且报错的表字段少,且是用主键执行UPDATE,因此不可能是索引问题。
回看了报错时间前10分钟的日志,发现之前有大的数据量查询、更新,但都是很正常的,只有到这条SQL时,突然就出现异常了。因此,我判断是数据库自身性能问题。
过程我就不细写了,最终判断为缓冲池的问题。修改完后系统速度立马从拖拉机变成飞机。
附上修改方案:
说明:是经常锁表的表名
1、 在数据页中预留空间
alter table (表名) PCTFREE 30(预留30%)
load from of ixf modified by pagefreespace=30 replace into
2、新建缓冲池:
db2 create bufferpool bp_tbs size 1000 pagesize 4k
alter tablespace TBS bufferpool bp_tbs
当脏页超过CHNGPGS_THRESH(%,db cfg)时,缓冲池将被清空并写回
3、延展缓冲池:
ESTORE_SEG_SZ& NUM_ESTORE_SEGS(db cfg)
db2 alter bufferpool ibmdefaultbp [ not ] extended storage
4、表格重整:
db2 reorg table
5、索引重整:
db2 reorg indexes all for table _options_
options:allow read|write|no access, cleanup only pages|all(不重建索引结构,只回收空索引页)
参考文献:
数据页的缓冲池管理
DB2数据库性能调整的相关命令