[20180829]减少日志生成量.txt

来源:这里教程网 时间:2026-03-03 11:56:46 作者:

[20180829]减少日志生成量.txt --//最近一段时间优化一下生产数据库,主要是问题比我预计要严重,实际上exadata实在太快了,把许多问题都给掩盖了. --//实际上这个问题很早就存在,我实在不想提,基于国内许多应用都可能存在类似问题,还是写一下. SQL ordered by Executions     %CPU - CPU Time as a percentage of Elapsed Time     %IO - User I/O Time as a percentage of Elapsed Time     Total Executions: 13,385,158     Captured SQL account for 65.4% of Total Executions  Rows Processed     Rows per Exec     Elapsed Time (s)     %CPU     %IO     SQL Id            SQL Module     SQL Text .... 140,257     139,411                     0.99                14.74     101.1      0     5f2atm993xz6w     PORTAL.EXE     update PD_PMXS SET PDBZ =:"SYS..." 140,256     140,256                     1.00                19.11     102        0     bs2qwd0crz5f3     PORTAL.EXE     update PD_DLB SET PDBZ =:"SYS_..." --//一天不到1万人次就诊,修改PD_DLB表在1个小时内就14万次,注意看Rows per Exec,每次修改1条.很明显在做无效刷频. --//我曾经跟一些开发讲过,在写代码时注意这些刷频语句.这些语句单条执行很快,但是执行很频繁,累积起来就很可怕. --//甚至最终就是这样运行模式导致运行缓慢.. --//真心感到可悲的是,我们团队大部分比我熟悉表结构,PD_DLB(排队表)这个表当天处理完后要删除里面的记录的. --//也就是最大记录量当天就诊人次,不大可能出现每小时14万次的修改,这么多人看awr报表,就没人注意到这么简单的问题吗? 5f2atm993xz6w update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 修改为 update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 and  PDBZ <> :"SYS_B_0" and STATUS <>:"SYS_B_1" --//错误,应该修改如下: 修改为 update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 and  (PDBZ,STATUS) not in(( :"SYS_B_0" , :"SYS_B_1" ); bs2qwd0crz5f3 update PD_DLB SET PDBZ =:"SYS_B_0" WHERE RDID =:1   修改为 update PD_DLB SET PDBZ =:"SYS_B_0" WHERE RDID =:1 and  PDBZ <> :"SYS_B_0" --//补充一下实际上不能这样1条1条改,猜测是打开brid的游标,然后循环修改相关记录. --//这样执行效率很低,而是一气呵成,一次修改需要的记录. --//不想使用logminer探查,随手找一个brid查询,使用as of查询方式. SELECT ROWID x         ,versions_starttime         ,versions_endtime         ,versions_xid         ,versions_operation         ,versions_startscn         ,versions_endscn         ,PD_DLB.PDBZ,pd_dlb.*     FROM PD_DLB VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;    WHERE RDID =11327282 ORDER BY versions_endscn; --//这样运行10分钟都没结果出来,只能改成查询10分钟之前的变化. SELECT ROWID x         ,versions_starttime         ,versions_endtime         ,versions_xid         ,versions_operation         ,versions_startscn         ,versions_endscn         ,PD_DLB.PDBZ,pd_dlb.*     FROM PD_DLB VERSIONS BETWEEN TIMESTAMP sysdate-15/1440 and sysdate    WHERE RDID =11327282 ORDER BY versions_endscn; --//结果不贴出了.15分钟内查询到112条,基本在做无用功.可以看出15*60/112 = 8.035, 8秒有一次刷新. SELECT ROWID x         ,versions_starttime         ,versions_endtime         ,versions_xid         ,versions_operation         ,versions_startscn         ,versions_endscn         ,PD_PMXS.status,PDBZ,PD_PMXS.*     FROM PD_PMXS VERSIONS BETWEEN TIMESTAMP sysdate-15/1440 and sysdate    WHERE RDID =11327282 ORDER BY versions_endscn; --//看到开发这样写代码,真心的很无语.这样问题已经存在多年,这么多人,无数的眼睛在看代码没人提出异议吗?可悲可叹..

相关推荐