学习oracle技术,每天学一点,每天进步一点

一个性能优化的案例

上一篇 / 下一篇  2008-04-08 10:42:58 / 个人分类:数据库维护

1.以前 业务处理时要求 插入某 表的处理方式(该表已经是分区):
Lx(JA nCt0    每个客户对应的每种游戏,在做影象时对中都会生成一条记录
Y,x6`E1[4S0    如果客户没玩游戏该条记录补0(目前客户数50000,8个游戏 t做影象每天需要增加400000多行记录,

   一个月也就400000*30=12000000万),增加量很快
3O~;]/Ix6p.m;O R0   而且本身这个表建立了四五个全局索引,通过程序插入时每天需要半个钟头左右,

  随着数据量增加 插入越来越慢, 按分区查询时一个月数据量也很大,影响报表查询

2.通过与业务相结合讨论建议
"RaU vt$E0   如果该客户没玩游戏,在该表中不产生记录,这样就少了很多记录,其中每天在线玩家数也就几百左右

那这样产生的数据量也就(500*8=4000左右) 大大减少了数据量的产生ITPUB个人空间VO-iXw:B
   提高后台相关报表查询性能和减少做影像时间ITPUB个人空间k;Q,})Q)B4n2Z

3.数据对比
f7A-SA:wT0  select count(*) from test (全部)ITPUB个人空间0WR0U$T y mT
    80000000
W|/}5j8m-` t? Hl0  select count(*) from test (去除为0的记录)ITPUB个人空间pf6F2lr2}?
  where amount>0  

    800000ITPUB个人空间K5_3q5M)[ O'N
  数据量相差100倍

4.实施 因为是在线系统 晚上12点做影像 所以在这之前或之后做好就行

  因为是分区表为了不影响生产性能按分区插入提高插入数据速度:

  改为非分区表

 create table  tempITPUB个人空间6T }l'O e&M vU^/|(A
(

column1 number(20);

column2 varchar2(2);

......
{F.f I k0 );

--插入数据到临时表中ITPUB个人空间!Y_fR3}
insert into tempITPUB个人空间$I H sR9P g:KT
select * from test  partition(P200608)
;M_5f Y5Z,^}U0  where  amount>0;

insert into temp
7F6D,o8Q\QdJ0select * from test  partition(P200609)ITPUB个人空间 k%eyf!`
  where  amount>0;

 

......

alter table test rename to test_bak;

alter table temp rename to test;

drop table test_bak;

重建相关索引和分析数据

 

5.效果

目前插入由以前的半个小时变到几十秒钟,相关查询报表速度提高很多

性能得到明显提高

6.总结

性能优化是个长期的过程,要不断的跟踪与观察,还要非常了解业务,

这样才会对系统提出更好的建议


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-05  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 16117
  • 日志数: 277
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-09-03

RSS订阅

Open Toolbar