MYSQL编程:让百万级数据刹时导进SQL Server实行案...
尽管MySQL也有一个认证培训项目,但是它的培训却要比Oracle或MS-SQL相差很远。尽管有的使用MySQL的用户表示,MySQL很容易上手,但是对于具有企业级数据库需求的用户来说,</p>想必每一个DBA都喜好应战数据导进工夫,用时越长工作效力越高,也充实的可以证实本人的气力。实践事情中偶然候必要把大批数据导进数据库,然后用于各类程序盘算,本文将向人人保举一个应战4秒极限让百万级数据刹时导进SQLServer实行案例。本实行将利用5中办法完成这个历程,并具体纪录各类办法所泯灭的工夫。所用到工具为VisualStudio2008和SQLServer2000、SQLServer2008,分离利用5中办法将100万条数据导进SQLServer2000与SQLServer2008中,实行情况是DELL2850双2.0GCPU,2G内存的服务器。感乐趣的伴侣能够下载源代码本人考证一下所用工夫。
好了,上面我们分离利用基础的Insert语句、利用BULKINSERT语句、在多线程中利用BULKINSERT、利用SqlBulkCopy类、在多线程中利用SqlBulkCopy类五种办法,应战4秒极限。还要有一点必要举行申明,本实行中实行SQL语句的中央利用了IsLineFrameWork框架中的DataProvider模块,这个模块只是对SQL设置的读取和封装,其实不会对终极了局有实质性的影响,关于IsLineFrameWork框架方面的常识,请参考“IsLineFrameWork”框架系列文章。
数据库方面利用SQLServer2000与SQLServer2008,表名TableB,字段称号为Value1,数据库名能够在App.config中修正,默许为test。
办法一.利用基础的Insert语句
这类办法是最基础的办法,年夜多半人一入手下手城市想到这类办法。可是Insert语句仿佛其实不合适多量量的操纵,是否是如许呢?
本办法中将100万数据分为10个批次,每一个批次10万条,每10万条1个事件,分10次导进数据库。
-->基础语句:
InsertIntoTableB(Value1)values(‘”+i+”’);申明:语句中的i是宿主程序中的一个累加变量,用于添补数据库字段中的值。
SQLServer2000耗时:901599
SQLServer2008耗时:497638
办法二.利用BULKINSERT语句
这个类的效果,在本实行中能够说是最使人中意的了,它的利用最烦琐、天真,速率很快。
“BULKINSERT”语句仿佛不是很经常使用,Aicken传闻Oracle中有一种能够将内部文件映照为Oracle一时表,然后间接将一时表中的数据导进Oracle其他表中的办法,这类办法的速率十分使人中意,SQLSERVER的BULKINSERT是否是一样使人中意呢?
--> 基础语句:
BULKINSERTTableBFROM
c:sql.txtWITH(FIELDTERMINATOR=,,ROWTER
/.,mbMINATOR=,BATCHSIZE=100000)
申明:“c:sql.txt”是一个事后天生的包括100条数据的文件,这些数据以“”标记分开,每10万条数据一个事件。
SQLServer2000耗时:4009
SQLServer2008耗时:10722
办法三.在多线程中利用BULKINSERT
在办法二的基本上,将100万条数据分五个线程,每一个线程卖力20万条数据,每5万条一个事物,五个线程同时启动,看看如许的效果吧。
SQLServer2000耗时:21099
SQLServer2008耗时:10997
办法四.利用SqlBulkCopy类
这类办法速率也很快,可是要依附内存,关于几万万条、多字段的庞大数据,大概在内存方面会有较年夜的损耗,不外可使用64位办理计划处置这个成绩。
几万万条、多字段的数据的情形一样平常在一些营业场景中会碰到,好比盘算环球消耗者某个营业周期消耗额时,要先取得主数据库表中的会员消耗纪录快照,并将快照贮存至一时表中,然后供盘算程序利用这些数据。而且有些时分消耗者的消耗数据其实不在一台数据库服务器中,而是来自多个国度的多台服务器,如许我们就必需借助内存或外存设备直达这些数据,然后洗濯、兼并、检测,最初导进公用表供盘算程序利用。
基础语句:
using(System.Data.SqlClient.SqlBulkCopysqlBC
=newSystem.Data.SqlClient.SqlBulkCopy(conn))
{sqlBC.BatchSize=100000;sqlBC.BulkCopyTimeout
=60;sqlBC.DestinationTableName="dbo.TableB";
sqlBC.ColumnMappings.Add("valueA","Value1");
sqlBC.WriteToServer(dt);}
申明:
BatchSize=100000;唆使每10万条一个事件并提交
BulkCopyTimeout=60;唆使60秒按超时处置
DestinationTableName="dbo.TableB";唆使将数据导进TableB表
ColumnMappings.Add("valueA","Value1");唆使将内存中valueA字段与TableB中的Value1字段婚配
WriteToServer(dt);写进数据库。个中dt是事后构建好的DataTable,个中包括valueA字段。
SQLServer2000耗时:4989
SQLServer2008耗时:10412
办法五.在多线程中利用SqlBulkCopy类
基于办法四,将100万条数据分五个线程,每一个线程卖力20万条数据,每5万条一个事物,五个线程同时启动,看看如许的效果吧。
SQL2000耗时:7682
SQL2008耗时:10870
了局
几天的工夫终究把这个实行给完成了,对照使人扫兴的是SQLSERVER2008导进数据的功能仿佛其实不想我们设想的那样优异。
对免费版的用户也具有充足的支持服务。在dev.mysql.com上,一个大型的MySQL学习教程强大社区用户和开发者可以讨论所有关于MySQL的事情。这个站点拥有博客、指南、视频、技术交流会、白皮书和论坛等方式的交流。 大家注意一点。如下面的例子: 在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。 可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
页:
[1]