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

来源:互联网 发布:python应聘有什么要求 编辑:程序博客网 时间:2024/05/17 07:18

前言

前两天,执行了一个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是我们这张表的主键,同时也是设置了索引的列)

 

原创粉丝点击