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

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大量数据插入几种方式速度的比较

大量数据插入几种方式速度的比较 在设计数据库里,我们就应该去数据库设计的性能进行评估。但是在经验不足的情况下,就需要快速建立一个和真实环境相近的数据库,进行性能测试。在这个过程中,遇到的第一个问题就是如何快速地插入千万级数据。 一个新手可能会写出下面的代码。(索引未建) Insert into dbo.Simple values (@I, RAND() * 2000000000)   然后在外面加个循环。大概测试了一个,10万数据,用时100秒。那么1000万数据,就要用时1万秒。大约是将近3个小时。(好吧,我知道我的电脑很烂。服务里上只要1个小时20分钟。)这个速度是难以让人接受的。因为拥有1000万数据的数据库,直接从文件导入数据,大约只需要不到10分钟。我们希望造假数据的速度和这个时间在同一个单位级别上吧。 其实最简单的办法,就是在刚才写好的语句前加个Begin Tran然后结尾加个Commit Tran就可以了。这个方式插入1000万条数据,大约用时18.5分钟。代码如下: Declare @I int Set @I = 0 Begin Tran InsertData: Insert into dbo.Simple values (@I, RAND() * 2000000000) Set @I = @I + 1 If @I 100000 ??? Goto InsertData Commit Tran 注: BEGIN TRAN标记事务开始 COMMIT TRAN 提交事务 一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN 之间作为一个事务处理 也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGIN TRAN之前的状态。 这个是事务处理。 例如你需要更新一个数据,但是这个数据存在于两个表内,你需要用两个update语句。如果第一个执行成功,第二个由于某种原因执行失败,将导致这个数据的不一致。数据库的数据就出错了。 如果想要避免,就用BEGIN TRAN...COMMIT TRAN ,把这两个update写在中间,如果发生如上的事情,第一个update的数据,将被退回,即没有被更新。你收到错误信息,就知道更新完全没有进行,不需要考虑部分更新的情况。   还有一个方法就是拼SQL,因为之前都是一个Insert语句插入一条数据,但是Insert是可以一次插入多条的啊。可以定义一个varchar(8000)变量,然后把要插入的假数据接在后面。最后用EXEC运行。如下。 Declare @I int DECLARE @sql varchar(8000) Set @I = 0 ResetSql: Set @sql = Insert into dbo.Simple values ComInsert: Set @sql = @sql + ( + CONVERT(varchar(10), @I) + , + CONVERT(varchar(10), Convert(int, RAND() * 2000000000)) + ) If @I % 300 = 299 Begin ??? exec (@sql) ??? Set @I = @I + 1 ??? Goto ResetSql End Set @I = @I + 1 If @I 100000 Begin ??? Set @sql = @sql + , ??? Goto ComInsert End   怎么这么复杂?首先因为varchar(8000)放不下所有的数据,所以要分批插入。而且简单起见上面的代码并没有做到准确地插入1000万条,而是插入了9999900条。 这个比第二种方式稍稍快一点。用时15分钟。不过为了这么点性能,多写这么多代码,感觉还是不太值得,除非要是插入上亿数据,省下半小时时间还是值得的。 ?   另外,如果需要多次清空、重新插入。那么把之前的数据导出到TEXT文件里会更快一些,如上文所说,导入1000万数据要10分钟。导出也只要2分钟。 导出的代码如下: EXEC master.dbo.sp_configure show advanced options, 1 RECONFIGURE EXEC master.dbo.sp_configure xp_cmdshell, 1 RECONFIGURE ? EXEC xp_cmdshell bcp SELECT * FROM Sample.dbo.Simple queryout C:data.txt -T -S(local)SQLEXPRESS -c -t,   生成的Text文件是以逗号将每列分

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档