1.以前 业务处理时要求 插入某 表的处理方式(该表已经是分区):
Lx(JAnCt0 每个客户对应的每种游戏,在做影象时对中都会生成一条记录
Y,x6`E1[4S0 如果客户没玩游戏该条记录补0(目前客户数50000,8个游戏 t做影象每天需要增加400000多行记录,
一个月也就400000*30=12000000万),增加量很快
3O~;]/Ix6p.m;OR0 而且本身这个表建立了四五个全局索引,通过程序插入时每天需要半个钟头左右,
随着数据量增加 插入越来越慢, 按分区查询时一个月数据量也很大,影响报表查询
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.fI
k0 );
--插入数据到临时表中ITPUB个人空间!Y_fR3}
insert into tempITPUB个人空间$I
HsR9P g:KT
select * from test partition(P200608)
;M_5fY5Z,^}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.总结
性能优化是个长期的过程,要不断的跟踪与观察,还要非常了解业务,
这样才会对系统提出更好的建议