杭州社保系统分析方案 USERS_LOG
2.326396411 表空间碎片将会直接影响系统的性能,建议整理一下。
第9章热点对象统计
以下为存在热点的对象,由于监控时间有限,需要做进一步确认,跟踪确认涉及到的SQL,并针对该sql进行优化。如果优化以后还存在热点,请rebuld table,index
AC30 AC32 AD07 IC02 IC22_BACK IC34 KC08 KC21 KC60 LB02 INDX_AC01_AAC002 INDX_KC04_AAC001 PK_KC04 INDX_AC10_AAE002 INDX_AC10_AAE143 IDX_AB08_AAA060 ZA01 KA02 IDX_LB02_AAE145 INDEX_KC21_AAC001 INDEX_KC21_AKB020 INDX_KC08_AAC001 PK_AC40 PK_COLLATE_SUM PK_KC21 AC13 INDX_AB07_AAE002 INDX_AB13_AAB001 IDX_AB08_AAE140 INDEX_IX_AKC020 PK_IC10_NEW AC14 AB07 AB08 PK_AC04_AAC001 INDEX_INDEX_AC32_2 INDX_AC32_AAC001 INDEX_INDEX_KC02_ KC04 PK_KC24 AC05 IDX_LOGTRANC_1 AB01 PK_AC01_AAC001 AC01 INDX_AC01_AAC008 IC10 IC20_BACK LOGTRANC GL_DETAIL I_GL_DETAIL_1 GL_VOUCHER PK_T_AAB001 PK_IT_SMK_GRDZB KC69 IX_KC04_ID IX_AB13_ID IDX_AC13_1 IDX_AC13_AAC001 INDEX_KC24_CKC131_2 AC01_APPEND 第10章其它问题
经过两天的监控发现如下问题:
1. Oracle session连接比较多,并且长时间的连接占很大的比例,建议定期的kill
2. Oracle 后台的alert文件,ora-01555的错误,该错误主要是由于快照过老导致的,该问题通过由于sql
可以解决。
3. 表和索引没有统计分析,导致SQL执行计划不稳定。
4. 数据量很大,目前生产库达到1.3 TB以上,所以,导致性能下降。
26
第11章 总结
? 清除不使用的表和索引,对索引使用监控两个业务周期后,和开发人员确认以后,清除所有不用索
引
? 根据目前系统资源的情况,不建议修改oracle pga和sga参数,理由由于目前内存已经不足,增加
pga和sga的大小,会导致更为严重的IO问题 ? 重建或在线重构出现资源竞争的索引和表
? 继续抓TOP sql进行优化,等完成大部分的sql以后,可以根据系统的运行情况调整系统配置,比
如增加redo log的大小,增加db writer
? 优化SQL建议,考虑对目前的热点盘进行IO分散 ? 分离oltp和olap
? 由于系统的cpu消耗中约有20%用于IO等待,所以,建议优化消耗CPU及IO的SQL,详见TOP
SQL
? 升级为rac,分担系统压力
? 由于系统没有灾备,处于单点运行,这样极具风险,建议增加灾备。
? ?
cursor_sharing=similar,减少SQL硬解析
根据监控的情况我们可以看出,系统大量采用了基于事务的临时表,所以,导致临时表空间竞争比较高,同时,事务回滚现象严重,逻辑读过高消耗大量的CPU,建议优化临时表的使用方式。详见TOP SQL中大量针对临时表操作同时针对临时表进行delete操作。 ? ? ?
压缩存在碎片的表空间
尽量避免业务人员生成环境中进行手工的统计查询。
尽量避免业务人员在办理业务的时候,开多个窗口,或是开发中限制多窗口的使用。
第12章 附录 优化结果对比
12.1案例一
对临时表进行分析以后,同时,采用Oracle hint指定系统的执行路径优化情况如下:
27
杭州社保系统分析方案 pkg_a_temptabletest.pck优化对比80时间(分钟)6040200系列1优化前60优化对比 优化后212.2案例二
SELECT COUNT(1) FROM AC01 A
WHERE EXISTS (SELECT 1 FROM AC02
WHERE AC02.AAC001 = A.AAC001 AND AAE140 = '51' AND AAC031 = '1') AND EXISTS (SELECT 1 FROM AC02
WHERE AAC001 = A.AAC001 AND AAE140 IN ('12', '15', '16') AND AAC031 = '1') 优化后:
SELECT /*+ USE_HASH(A,AC32) ALL_ROWS */COUNT(1) FROM AC01 A
WHERE EXISTS (SELECT 1 FROM AC02
WHERE AC02.AAC001 = A.AAC001 AND AAE140 = '51' AND AAC031 = '1') AND EXISTS (SELECT 1 FROM AC02
WHERE AAC001 = A.AAC001 AND AAE140 IN ('12', '15', '16') AND AAC031 = '1') 执行情况对比:
28
SQL语句优化对比30002500)2000(秒1500时间10005000优化前优化后系列12605275优化对比
29
杭州社保系统分析方案
?
30