大数据导入之Bulk Insert的一点总结

    最近项目中需要对服务程序进行大规模的模拟测试,于是专门写了一个测试程序,测试程序包含:测试数据的管理,功能测试,流程测试,压力测试。

    对于要测试的程序的数据源来自数据库,所以,需要模拟一个大的数据量,从1W,10W,100W,1000W...。其实,一直以来没有怎么搞过大数据,写程序的时候,最多搞一两条记录测试一下功能,功能OK了就提交代码,进行下一步测试了。但是,进行实际的测试中,总是有这样或者那样的问题冒出来,归根到底是测试做的不够,特别是服务程序,稳定性的保障是排在第一位的,所以,一个服务程序进行大规模的数据测试是很有必要的。也是因为没有怎么处理过大数据,所以,当我尝试插入100W数据的时候,我使用的方式竟然是Append+Post,效率的低下可想而知,这种低效率的痛苦也迫使我设法换一个方案,或者增加一个接口,以便能够快速的完成模拟数据的插入。

    其实之前搞过BCP,网上查了下,也有一种Bulk Insert的方式可以使用。

    那先说一下BCP这种方式:BCP这种方式,其实是调用个SQL Server提供的一个工具,用户采用命令行的方式调用,是将一个格式化的字符串文本导入到数据库,效率比较高,而且,BCP的执行不一定要在SQL Server那一侧,执行环境没有装SQL Server也可以,只要将BCP相关的文件拷贝到执行目录就行,这个是相对于Bulk Insert相对比较方便的地方,但是,就我使用的经历来看,BCP也有一个风险:采用调用BCP进程的方式,有时候会出现启动进程失败的问题。

   说说Bulk Insert。从查询资料到搞定用了4个小时,其实整个过程还是比较顺利的,说一说它的特点:

   1 Bulk Insert是SQL Server提供的一个命令,可以使用SQL语句的方式使用。

    2 也是将预定格式的文本批量导入到数据库中,如果数据文件不在SQL Server那一侧,需要使用UNC的文件路径,这个比较不爽,这个有时候会涉及到权限的问题,所以,暂时没有使用,但是,这个往往出现一个错误,说是找不到指定的文件,其实就是远程执行这个命令,而且数据文件也不在服务器上就会出现提示打不开指定文件的错误信息。

    3 可以使用with ()进行一些约束,一般字段之间使用一个字符隔开,就需要使用约束说明字段的分割符号,否则,也会报错。

    4 某个字段为NULL,并且无值或者自增主键,那么就保持空白,添加一个字段分隔符就行,在导入的时候就会正确的解析导入。

    5 如果最后一个字段有值,就不需要再输入字段分割符号了,如果表示为NULL,则需要增加一个字段分割符号。

    6 使用回车换行符号隔开两行记录,就不需要在约束中指明行隔开符号。

    7  这种方式导入是事务安全的

    8 由于使用SQL语句的方式导入,需要需要考量数据量大小,从而灵活的设置命令执行的超时时长。

    9  每个记录文本需要保证添加一个空行

    上面9条就是Bulk Insert的初次使用的一个感受,通过SQL语句比使用BCP简洁,执行的效率确实快,我在一个8核的机器上,导入1000W记录,用了4分钟左右。

    

    BCP/Bulk Insert都是基于格式化文本,如果数据量小,不过于追求效率,append,post这些已经够用了,BCP/Bulk Insert折腾起来有时候也会遇到很多问题,只是一旦搞定了,用着也很安心。对比两者,我还是倾向于Bulk Insert的方式,在一个Connection中完成,不必输入太多的信息,更加关注与数据。

    感受:解决问题的方案有好多种,这些方法都有个各自的特点,具体使用哪种方法需要考察使用的场景,不能一条路走到死,否则,就死路一条了。1000W/4Min,这个效率在某些真正的大数据量的情况可能还是不够,那也许就要用到其他的方式。

你可能感兴趣的:(经验,结论,数据库,BCP)