国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页数据库类SQL Server → 实战手记:让百万级数据瞬间导入SQL Server

实战手记:让百万级数据瞬间导入SQL Server

我要评论 2010/06/24 20:10:36 来源:国语自产精品视频在线看 编辑:佚名 [ ] 评论:0 点击:213次

想必每个DBA都喜欢【dōu xǐ huān】挑战数🎇据导入时间🐭,用时越⚓短工作效率越【xiào lǜ yuè】高😑,也充分的能够证明自🐬己的实【jǐ de shí】力。实际工【shí jì gōng】作中有时候需要把大量数据【liàng shù jù】导入数据库⛎,然后用【rán hòu yòng】于各种【yú gè zhǒng】程序计【chéng xù jì】🌥算【suàn】,本文将🧛向大家⬛推荐一【tuī jiàn yī】个挑战【gè tiāo zhàn】🤤4秒极限😼让百万【ràng bǎi wàn】级数据瞬间导🔞入SQL Server实验案例。

本实验将使用【yòng】📲5中方法👡完成这【wán chéng zhè】个过程,并详细【bìng xiáng xì】记录各🉐种方法【zhǒng fāng fǎ】所耗费【suǒ hào fèi】的时间【de shí jiān】。所用【yòng】到🤨工具为【gōng jù wéi】😑Visual Studio 2008和➿SQL Server 2000、SQL Server 2008,分别使【fèn bié shǐ】用【yòng】5中方法👡将100万条数【wàn tiáo shù】🧦据导入SQL Server 2000与【yǔ】SQL Server 2008中,实验环🦗境是【jìng shì】DELL 2850双2.0GCPU,2G内存的🧓服务器。感兴趣的朋友可以下载源代码自己验证一🍦下所用【yòng】🀄时间。

好了,下面我【xià miàn wǒ】们分别【men fèn bié】📝使用基【shǐ yòng jī】本的Insert 语句🎽、使用【shǐ yòng】BULK INSERT语句🎽、在多线程中使🧚用BULK INSERT、使用【shǐ yòng】SqlBulkCopy类【lèi】、在多线程中使🧚用SqlBulkCopy类【lèi】五种方法【fāng fǎ】,挑战📌4秒极限👁。还要有一点需🐘要进行🔋说明,本实验【běn shí yàn】中执行【zhōng zhí háng】SQL语句🎽的地方【de dì fāng】使用【shǐ yòng】了😿IsLine FrameWork框架中的DataProvider模块🦅,这个模【zhè gè mó】🏐块只是🤛对SQL配置的读取和【dú qǔ hé】🛒封装🍶,并不会【bìng bú huì】对最终结果有本质性的影响,关于🧠IsLine FrameWork框架方面的知【miàn de zhī】识,请参考【qǐng cān kǎo】“IsLine FrameWork”框架系列文章【liè wén zhāng】。

数据库【shù jù kù】👂方面使【fāng miàn shǐ】用🆎SQL Server 2000与🏃SQL Server 2008,表名TableB,字段名【zì duàn míng】🦍称为Value1,数据库【shù jù kù】👂名可以在App.config中修改【zhōng xiū gǎi】,默认为test。

方法一.使用基本的Insert 语句

这种方【zhè zhǒng fāng】〰法是最【fǎ shì zuì】♟基本的🌰方法【fāng fǎ】,大多数人一开始都会想到这种方【zhè zhǒng fāng】〰法。但是【dàn shì】🕍Insert语句似乎并不【hū bìng bú】💿适合大【shì hé dà】批量的🍄操作,是不是这样呢?

本方法中将100万数据分为⛏10个批次【cì】📯,每个批【měi gè pī】次【cì】📯10万条【wàn tiáo】🕕,每【měi】10万条【wàn tiáo】🕕1个事务,分10次【cì】🛄导入数据库【jù kù】⛪。

-->基本语句:

Insert Into TableB (Value1) values (‘”+i+”’); 说明【shuō míng】:语句中💗的i是宿主【shì xiǔ zhǔ】🌱程序中【chéng xù zhōng】的一个累加变量【liàng】,用于填❕充数据库字段🏟中的值。

SQL Server 2000 耗时【hào shí】🈳:901599

SQL Server 2008耗时【hào shí】⛎:497638

方法二.使用BULK INSERT语句

这个类【zhè gè lèi】的效果【de xiào guǒ】,在本实验中可【yàn zhōng kě】🌥以说是最令人👎满意的【mǎn yì de】🚩了,它的使用最简➖便【biàn】、灵活,速度很🥑快。

“BULK INSERT”语句似🦈乎不是很常用, Aicken听说Oracle中有一📯种可以将外部文件映🍆射为【shè wéi】Oracle临时表💝,然后直接将临【jiē jiāng lín】🔚时表中【shí biǎo zhōng】👅的数据【de shù jù】🎺导入Oracle其他表中的方【zhōng de fāng】🌷法【fǎ】,这种方【zhè zhǒng fāng】法【fǎ】的速度非常令人满🐍意,SQL SERVER的BULK INSERT是不是同样令【tóng yàng lìng】人满🐍意呢【yì ne】?

--> 基本语句:

BULK INSERT TableB FROM '

c:\\sql.txt' WITH (FIELDTERMINATOR = ',',ROWTER

/.,mbMINATOR='|',BATCHSIZE = 100000)

说明:“c:\\sql.txt”是一个【shì yī gè】预先生【yù xiān shēng】成的包含🤮100条数据💯的文件⬛,这些数据以【jù yǐ】✴“|”符号分隔【gé】,每🔶10万条数【wàn tiáo shù】据💯一个事务。

SQL Server 2000耗时【hào shí】🌘:4009

SQL Server 2008耗时【hào shí】👟:10722

方法三⏺.在多线【zài duō xiàn】程中使用【yòng】😡BULK INSERT

在方法【zài fāng fǎ】✋二的基础上,将【jiāng】100万条数据【jù】分五个线程,每【měi】个线🧜程负责【chéng fù zé】🕠20万条数据【jù】,每【měi】5万条一【wàn tiáo yī】🔖个事物,五个线程同时〽启动,看看这😤样的效果吧。

SQL Server 2000耗时【hào shí】🏈:21099

SQL Server 2008耗时【hào shí】🏏:10997

方法四.使用SqlBulkCopy类

这种方【zhè zhǒng fāng】法速度也很快,但是要依赖内🧞存,对于几【duì yú jǐ】🏰千万条【qiān wàn tiáo】、多字段的复杂数据,可能在内存方【nèi cún fāng】面会有💱较大的【jiào dà de】消耗,不过可🕯以使用【yǐ shǐ yòng】64位解决方案处👮理这个🚮问题【wèn tí】🛬。

几千万【jǐ qiān wàn】🍥条【tiáo】🔱、多字段的数据【jù】的情况🤔一般在一些业【yī xiē yè】👚务场景中会遇到,比如计【bǐ rú jì】算全球消费者某个业【mǒu gè yè】务周期😣消费额时,要先获得主数据【jù】库表中【biǎo zhōng】🔫的会员消费记【xiāo fèi jì】录快👙照,并将快🎎照储存【zhào chǔ cún】至临时表中【biǎo zhōng】🔫,然后供🖐计算程【jì suàn chéng】序使用【xù shǐ yòng】这些数据【jù】。并且有【bìng qiě yǒu】🛳些时候消费者的消费数据并【shù jù bìng】不在一🏙台数据【tái shù jù】库服务器【wù qì】中,而是来自多个【zì duō gè】国家的多台服📯务器【wù qì】,这样我们就必🎣须借助✅内存或【nèi cún huò】🌘外存设🍭备中转【bèi zhōng zhuǎn】😘这些数据【jù】,然后清【rán hòu qīng】洗、合并、检测【jiǎn cè】🥣,最后导入专用表供计💀算程序使用【xù shǐ yòng】。

基本语句:

using (System.Data.SqlClient.SqlBulkCopy sqlBC

= new System.Data.SqlClient.SqlBulkCopy(conn))

{ sqlBC.BatchSize = 100000; sqlBC.BulkCopyTimeout

= 60; sqlBC.DestinationTableName = "dbo.TableB";

sqlBC.ColumnMappings.Add("valueA", "Value1");

sqlBC.WriteToServer(dt); }

说明:

BatchSize = 100000; 指示每【zhǐ shì měi】10万条一个事务【gè shì wù】🌹并提交🥙

BulkCopyTimeout = 60; 指示60秒按超【miǎo àn chāo】时处理👬

DestinationTableName = "dbo.TableB"; 指示将【zhǐ shì jiāng】数据导入【rù】🐼TableB表🏡

ColumnMappings.Add("valueA", "Value1"); 指示将内存中【nèi cún zhōng】🚏valueA字段与TableB中的【zhōng de】Value1字段匹🍑配

WriteToServer(dt);写入数【xiě rù shù】据库。其中dt是预先➿构建好的【de】DataTable,其中包🥊含【hán】valueA字段📨。

SQL Server 2000耗时【hào shí】🗒:4989

SQL Server 2008耗时【hào shí】🕠:10412

方法五【fāng fǎ wǔ】.在多线程中使用⏺SqlBulkCopy类【lèi】🈶

基于方【jī yú fāng】法四🐪,将【jiāng】100万条数据分五🕗个线程,每个线【měi gè xiàn】程负责🚺20万条数据👦,每5万条一【wàn tiáo yī】个事物【gè shì wù】🦏,五个线🉑程同时【chéng tóng shí】启动,看看这样的效果吧。

SQL 2000耗时:7682

SQL 2008耗时:10870

结果

几天的【jǐ tiān de】🍠时间终【shí jiān zhōng】于把这个实验给完成【gěi wán chéng】🗝了💳,比较令人失望的是SQL SERVER 2008导入数据的性能似乎【néng sì hū】并不想【bìng bú xiǎng】我们想象的那🕢样优秀📄。 

关键词:SQL,Server

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 欢迎喜欢
  • 0 白痴
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙视