由于银行业每年都需求进行年终决算,为了确保跨年当晚顺利完结决算,在年终决算之前都会有例行的数据库优化操作。当前行里事务的高速开展,数据堆集较快。前几年运用例行数据库优化计划现已不完全合适新的形势可是本年这次优化也采纳用了从前的操作过程:user.qzone.qq.com/2518065708/main】user.qzone.qq.com/1586254832/main】user.qzone.qq.com/2647161728/main】user.qzone.qq.com/2275185810/main】user.qzone.qq.com/2089533170/main】user.qzone.qq.com/3112175188/main】user.qzone.qq.com/3055548758/main】user.qzone.qq.com/2094238605/main】user.qzone.qq.com/2810118825/main】当天为完结优化的需手动kill掉优化进程并force掉数据库进程。终究执行db2 "select distinct status from syscat.tables"查询数据库系统表查看是不是一切表的状况正常,与预期的相同一切的表状况都是Normal,下班
就走人了。谁知道黑夜批量时由于该表无法拜访终究致使批量失利,造成严峻的出产事端。为此笔者耿耿于怀了一整天~
那么到底是什么原因致使了批量失利呢?那又为什么之前几年均依照相同的计划操作都没有疑问本user.qzone.qq.com/2768344305/main】user.qzone.qq.com/3112054830/main】user.qzone.qq.com/1813511395/main】user.qzone.qq.com/2747848070/main】user.qzone.qq.com/2713675597/main】年优化时却呈现疑问了呢?带着这个Problem,我周六一早就赶到公司对于这个疑问,在测验环境进行了复现。研究表明reorg其实是分期间进行的,如果你在index recreate期间强制force掉该操作,那么会致使重建索引失利。而之前之所以没疑问是由于数据量小,在索引重建失利后,一旦有事务来拜访该表,他会首先给表加Z锁然后重建索引,重建完结后就能够答应正常事务拜访。So这在数据量小的时候一切疑问并不是疑问,仅有的user.qzone.qq.com/3112095452/main】user.qzone.qq.com/2495132869/main】user.qzone.qq.com/2080502445/main】user.qzone.qq.com/1359147661/main】表象也即是应用在首次拜访时慢了罢了。可是在海量数据的情况下显然会呈现重大疑问,由于咱们优化的这个表当前存量数据约30亿条数据,当咱们对其重建索引时采纳force显然太过于经验主义了。由于当咱们对重建索引失利的表进行拜访时,他再次做重建索引的这项操作操作可能会历时数小时,这显然大大超过了批量保护窗口的时间束缚,从而致使发生事端。
所以为了让广阔博友不再犯像我类似的低级过错所以才有了此博文,一起也暴露了笔者的经验主义思想严峻、学艺不精。那么下面咱们就来彻底了解一下db2在做reorg操作时都是需求做哪些工作吧!
依据IBM企业网站介绍,咱们在宣布reorg指令时db2会经历Sort、Build、Replace IdxRecreate等4个期间。
1、其间build期间,运用表空间中空余空间(或指定表空间)暂时生成一个表进行表的重组,即便中止也不会对原有表或索引发生影响;
2、replace期间,也即是替换原表期间是无法以为手艺中止的,即便在此期间宣布了中止指令(CTRL+C)也对等此过程完结后,索引未重创前才中止,此时会清晰告诉用户索引未创立。
3、idxrecreate期间,能够手艺,一起清晰告诉用户索引未创立。
咱们能够经过以下手段监控reorg进展:
db2 get snapshot for tables on cbusdb|grep -ip tabname
db2pd -d cbusdb -utilities
以上完~~
另附一下近期遇到的一个小疑问:对于数据insert性能提升的方法
1. 去掉索引。
2. 去掉束缚。
3. 在 insert 语句中包含多行。
4. 选用 Append 形式
5. 屏蔽表的日志操作。
6. 选用并行写操作。
7. 选用严厉的阻隔等级