大量数据插入几种方式速度的比较

大量数据插入几种方式速度的比较

ID:38663652

大小:32.50 KB

页数:4页

时间:2019-06-17

大量数据插入几种方式速度的比较_第1页
大量数据插入几种方式速度的比较_第2页
大量数据插入几种方式速度的比较_第3页
大量数据插入几种方式速度的比较_第4页
资源描述:

《大量数据插入几种方式速度的比较》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、大量数据插入几种方式速度的比较在设计数据库里,我们就应该去数据库设计的性能进行评估。但是在经验不足的情况下,就需要快速建立一个和真实环境相近的数据库,进行性能测试。在这个过程中,遇到的第一个问题就是如何快速地插入千万级数据。一个新手可能会写出下面的代码。(索引未建)Insertintodbo.Simplevalues(@I,RAND()*2000000000)  然后在外面加个循环。大概测试了一个,10万数据,用时100秒。那么1000万数据,就要用时1万秒。大约是将近3个小时。(好吧,我知道我的电脑很烂。服务里上只要1个小

2、时20分钟。)这个速度是难以让人接受的。因为拥有1000万数据的数据库,直接从文件导入数据,大约只需要不到10分钟。我们希望造假数据的速度和这个时间在同一个单位级别上吧。其实最简单的办法,就是在刚才写好的语句前加个BeginTran然后结尾加个CommitTran就可以了。这个方式插入1000万条数据,大约用时18.5分钟。代码如下:Declare@IintSet@I=0BeginTranInsertData:Insertintodbo.Simplevalues(@I,RAND()*2000000000)Set@I=@I+1

3、If@I<100000   GotoInsertDataCommitTran注:BEGINTRAN标记事务开始COMMITTRAN提交事务一般把DML语句(select,delete,update,insert语句)放在BEGINTRAN...COMMITTRAN之间作为一个事务处理也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGINTRAN之前的状态。这个是事务处理。例如你需要更新一个数据,但是这个数据存在于两个表内,你需要用两个update语句。如果第一个执行成功,第二个由于某种原因执行失

4、败,将导致这个数据的不一致。数据库的数据就出错了。如果想要避免,就用BEGINTRAN...COMMITTRAN,把这两个update写在中间,如果发生如上的事情,第一个update的数据,将被退回,即没有被更新。你收到错误信息,就知道更新完全没有进行,不需要考虑部分更新的情况。  还有一个方法就是拼SQL,因为之前都是一个Insert语句插入一条数据,但是Insert是可以一次插入多条的啊。可以定义一个varchar(8000)变量,然后把要插入的假数据接在后面。最后用EXEC运行。如下。Declare@IintDECLA

5、RE@sqlvarchar(8000)Set@I=0ResetSql:Set@sql='Insertintodbo.Simplevalues'ComInsert:Set@sql=@sql+'('+CONVERT(varchar(10),@I)+','+CONVERT(varchar(10),Convert(int,RAND()*2000000000))+')'If@I%300=299Begin   exec(@sql)   Set@I=@I+1   GotoResetSqlEndSet@I=@I+1If@I<100000Be

6、gin   Set@sql=@sql+','   GotoComInsertEnd  怎么这么复杂?首先因为varchar(8000)放不下所有的数据,所以要分批插入。而且简单起见上面的代码并没有做到准确地插入1000万条,而是插入了9999900条。这个比第二种方式稍稍快一点。用时15分钟。不过为了这么点性能,多写这么多代码,感觉还是不太值得,除非要是插入上亿数据,省下半小时时间还是值得的。   另外,如果需要多次清空、重新插入。那么把之前的数据导出到TEXT文件里会更快一些,如上文所说,导入1000万数据要10分钟。导出

7、也只要2分钟。导出的代码如下:EXECmaster.dbo.sp_configure'showadvancedoptions',1RECONFIGUREEXECmaster.dbo.sp_configure'xp_cmdshell',1RECONFIGURE EXECxp_cmdshell'bcp"SELECT*FROMSample.dbo.Simple"queryout"C:"data.txt"-T-S(local)"SQLEXPRESS-c-t,'  生成的Text文件是以逗号将每列分开的一列一行纯文本文件。导入的代码如

8、下:bulkinsertdbo.Simplefrom'C:"data.txt'with(fieldterminator=',',rowterminator='"n')当需要往sqlserver里插入大量数据时,尤其是每条数据都不相同的时候,循环使用insert效率就会很低,这时尝试先将数据

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。