记一次调优的过程(转)
上一篇 /
下一篇 2008-07-08 16:50:19
记一次调优的过程
昨天下午业务这边反映在ipra中导BSP数据的时候越来越慢,已经到了无法忍受的程度,请求开发这边定位并解决问题。开发这边BSP数据的导入是我的一个同事负责,他看了看,不知道原因出在哪儿,让我帮他看一看。ipra中导BSP数据的大致流程是前台.net封装sqlldr将BSP数据从文本文件导入到一个中间表salbsp中,并随后针对salbsp展开一系列拆分、处理的复杂操作,并且会在适当的时候把这期数据从salbsp中delete掉。我先生成了一个ASH的report,发现所有的等待都是集中在salbsp上,全表扫描和CPU wait非常明显。然后我了解到他们一个上午总共导了几个G(好几千个文本文件)的BSP数据到salbsp中,我执行了一下select count(*) from salbsp,结果是4但很长时间才出结果。接着我看了一下他们sqlldr导入的control文件,呵呵,我已经知道原因了。上述导入操作会越来越慢的根本原因是他们使用了direct=Y(oracle文档里是direct=True,其实这里direct=Y和direct=True等价)来导入数据。
当在sqlldr中使用direct方式来导入数据的时候,oracle这里导入的时候实际上是绕过了SGA,直接写datafile,而且是直接在HWM以上写。这就导致了HWM会被不断抬高,这样即使后来delete掉了这批数据,HWM依然没有被降下来。HWM不断被抬高的直接表现就是在做全表扫描的时候会越来越慢!所以刚才salbsp中虽然只有4条记录,但是我对其执行select的时候依然等待了很长时间,因为这里oracle要一直全表扫描到HWM。知道了原因,就很好改了,我让他们先truncate表salbsp,然后再把sqlldr的control文件的direct=Y去掉即可。这里是应该去掉的,不仅仅是因为上述原因,还因为当使用了direct方式导数据的时候,实际上是不支持对同一个目标表的并发导入的,这是因为direct方式oracle这里会对目标表上加一个exclusive的锁。过了一会儿,问题马上被反馈到我这里,在去掉了direct参数后,整个BSP数据的导入操作失败!他们告诉我说原因是因为在去掉direct参数后,他们发现从salbsp中select数据的时候的显示顺序并不是和该数据所在的源文件的显示顺序一致了!而他们的处理是要求从salbsp中select数据的时候的显示顺序是一定要和该数据所在的源文件的显示顺序一致的!我告诉他们这种现象是可以理解的,因为当去掉direct参数后,oracle在导入的时候会先去HWM以下找,看是否有block的剩余空间能够容纳下所导入的数据,如果找到了就将数据插入到该block中,这样一来,显示顺序当然就不一致了!解决方法也是很简单的,对salbsp加一列存导入数据的行号,然后在相应control文件中指定RECNUM关键字让sqlldr在导数据的时候同时写入行号,最后显示数据的时候按行号order by一下就可以了。今天上午带闺女去打预防针,下午回到公司的时候,他们已经告诉我所有的16个国家的BSP数据已经全部导入,并且再也没有昨天的越导越慢的现象了:)
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: