【总结】大规模数据(300万条)测试时,需要注意的问题。

前言

前两天,执行了一个batch处理300万条数据

程序执行了33小时11分40秒

并且产生了10G多的log文件

 

事前准备(数据导入)

①数据导入所采取的方式

执行数据数据插入时,我们选择的方式最好是批处理

写一个存储过程,来对数据进行插入操作。

在oracle下面,我们还可以选择sqlldr命令导入ctl文件的方式导入数据。

 ②如何执行导入数据用的存储过程(分批次执行多次,不要直接循环300万次)

使用存储过程导入数据时,我们不要一下子就执行300万循环

我们可以把他分组为10万执行30次。

select create_date_100000();

select create_date_100000();

select create_date_100000();

 ③注意导入时,备份文件的清理

在postgre数据库上,执行存储过程生成数据时

会产生大量的备份文件,吃掉硬盘空间

我们要对这些备份文件及时进行删除处理

 

这么执行效果好像也不是太好

最佳执行方案:

每次执行1万件,执行300次

select create_date_10000();

。。。

。。。

select create_date_10000();

 

以上为100个,执行时可以一起执行的(两个叹号的那个图标),不用等这1个执行完了,再执行下一个(其实就是批处理,一次执行100个存储过程,每个存储过程生成1万条数据);

每次执行100个,每个1万件的执行时间大约是25秒到33秒之间

所以执行100万件也就需要50分钟,在这期间注意清空数据库的备份文件

 

如果单独执行10万件,所需的时间大约是15分钟

执行500万件直接卡死!!

 

 

 

程序的实施执行(注意log级别要使用真实环境下的,不应该有debug级别)

 

注意程序执行时的log级别

在这种情况下debug级别的log不应该出现

 

 

事后处理(如何更快的删除数据)

在执行完程序之后,我们一定要对我们插入数据库中的数据进行删除

在删除数据时,我们应该采取部分删除的方式。

比如

  delete from TBL_USER_INFO where update = '20120426' AND user_id like '0%';

  delete from TBL_USER_INFO where update = '20120426' AND  like '1%';

使用这种方式来删除数据

要比直接

delete from TBL_USER_INFO where update = '20120426'

一下删除300万条的数据效果要好。

(注:  ①update = '20120426' 是我们为了让寄存的数据与新插入的数据相互区分,所特定设置的值

        select count(user_id) from TBL_USER_INFO where update = '20120426'

        所得到的值就是300万

  ②user_id是我们这张表的主键,同时也是设置了索引的列)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值