Oracle调优(一)

两周前,公司组织了一个社外培训,不容易啊,工作了这么久,第一次参加社外培训,4天就4000多大洋

效果还不错,我纯粹是去扫盲了。。。哈哈,不过还是了解到了Oracle的一些原理,知道了原来软件真的是一大抄。。。

鉴于培训之前,胡同学的要求,要把有用的东西分享给公司的各位。

我现在又这么的无聊,就把这些学了的东西慢慢的一天天的写出来吧。

 

第一篇就从前两天的一个问题说起吧。

前两天遇到一个shanze同学发的问题,说site1的预约受付都是6秒,其他site都是3秒,数据一样,程序一样,时间不同。

而且,一直如此。

既然这样,可以判断,不是GUI的问题

理由1:site1一直如此,在其他site就只有一半的时间,如果是GUI的问题虽然也是会要慢就会一直慢,但是,当环境不同的时候,应该也是一样慢,不会有如此的特别

理由2:site1的数据正常,登陆一个预约记录,会生成400个左右项目,数据很普通

 

那么,可能的原因就应该是各个site的不同之比较了。

首先是数据量,众所周知,基础数据量会影响到性能,若基础数据量相差的很大的话,也是可以理解比其他site慢的。

所以,为了有理有据,我做了一个实验,在现有数据量的基础上,登陆一条预约,然后逐渐把数据量增大,判断时间的增量。

这个基础数据量的考量也是需要特殊判断的,要抓住主要矛盾,才能找出主要的制约,因为这样的问题我早已有了相当的经验,故,选用了the_d_exam_result_item表来作为增长对象。

当这个表的数据量在不到2,000,000的时候,大概只有不到2秒的时间

当这个表的数据量在增长了一个数量级,20,000,000的时候,明显的,同样的数据登陆时,发现到了5秒之多。

所以,初步判定是因为基础数据量太大。

但是。。。不幸的是,后来shanze同学把我的结论给否定了。

因为nanshusite的数据量更加大,达到了100,000,000,但他们的登陆却不慢。

这个时候的我被逼,无语,不知为何。但想到当时老师讲的东西,想想终于有了用武之地了。

 

数据库的配置,我以前是纯属蒙,这儿看一点那儿看一点。这回有了系统的知识,就不慌了。

首先,比较SGA区,SGA区是保存共享数据的,在我们的共享服务器式的Oracle数据库里,这个SGA区越大,每回能保存的东西就越多,这样就能尽量多的把经常运行的SQL,数据等保存在内存里,而不用频繁的去做IO读取,当时老师讲过,读硬盘和读内存的区别有多大呢,没有具体的数据,但可以给一个数据级的比较,1w倍。这样,如果IO过多,产生热点,大家都去疯狂读硬盘,肯定就需要大量的CPU,甚至造成等待。

比较的结果是,SGA区都是自动设定的,SIZE=0,没戏。自动设定就是Oracle自己根据运行情况自动分配SGA区。故,排除

 

其次,比较Share_pool,虽然看上去都是自动分配的,但是,share_pool的大小却是有了两倍之差,site1的share_pool是160M,site2的share_pool是360M,这么大的区别,肯定是会发生很大的差别的。虽然具体有多大我不好估计,但从这里入手应该是正常的

 

接着,比较IO,site1的数据文件基本上都是区分的user空间的数据文件,site2的数据文件就不同了,有一个专门的数据文件用于保存D_kensa的数据,还有几个文件是专门保存履历信息的,因为只读的话,产生的争用就比较少,而且,履历数据的存在其实使用的频度并不高,但如果跟当年的数据保存在一起的话,会造成基础数据量大。

 

而且,site2的IO比site1的少了一个位数,看上去原因找到了,site1虽然有多个数据文件,但每个数据文件的IO都比较平均,site2有比site1更多的数据文件,但IO只集中在前几个数据文件,履历的数据文件基本不访问。

这样,IO争用当然就少了,造成的CPU负担也就少了很多了。这样等待就少,等待少了肯定时间就短了。这个也是,理论,因无法真的去调试现场的DB,也就没有实践的数据了。。。。

 

这样的两个理由,让shanze同学去确认现场DB了,果然,shanze同学从那以后就去确认,再也没理我。。。

 

总结一下,其实调优,如果有的调,最好是调CPU,调内存,如果服务器的内存不够多,CPU不够强,可以直接先上好机器,上大内存,甚至上大型机,上RAC,上集群,总之,调硬件是一个入手的方位

不过,在健诊中,这个可不好,我们决定不了日本的服务器,就只能在现有的硬件基础上,进行相应的优化,DB端的优化,无非也就是加大SGA区,一般建议将物理内存的一半设定为SGA区,加大缓存区,将数据文件分开,减少IO

 

这个SGA区呢,健诊一般都是自动的,所以数据文件这里就值得研究一下了,数据库的数据都保存在数据文件中,按照表空间-段-区-块来存储,其实每条数据的Rowid就标识出这个数据存储于哪个区的哪个块了,所以,如果经常被访问的数据,放在同一个数据文件中,那么这个数据文件被读的可能性就会增高,加上还会往里写的话,就自然会发生IO问题,解决的话,把不同的数据分到不同的数据文件中,进行读写分离。

比如,健诊的M表,一般都是读,那么适合把M表的数据放到一个数据文件中,其他写入比较多的表放到另一个数据文件中,就会尽量减少读写的资源争用了。

健诊的D表呢,写入多,读取也多,这时候,如果把数据分离为履历和当时的数据,也可以减小数据文件的大小,使读写尽可能限制在小范围内。

具体的建表SQL,稍后添付

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值