転送します。https://www.cnblogs.com/LenLi/p/3903641.html
ボーは、より明白なデータを3万行に、プライマリ・インスタンスを組み合わせて、それを自分自身をテストします!!
約バルクデータ中のデータベースに挿入されたブログ、ストアドプロシージャの種類に渡すことによって、動作パラメータ表に関連付けることができる上に述べたように、私は、プロセスの効率を試験しませんでした。後でSqlBulkCopyクラスによる大規模なデータ挿入であることが判明見つけ、この記事では、このクラスの役割を紹介し、(命令挿入と比較して)効率の関連するテストを行います。
SqlBulkCopyは唯一のいずれかになります、同じサーバー上のリモートサーバー上に存在することができ、SqlServerのテーブルにデータを書き込むことができます。もちろん、データのみのSQLServerデータソースではないことを書き込まれる、データ・ソースは、データは、データを読み出すデータテーブルまたはDataReaderの中にロードすることができる限り、任意であってもよいです。
一括挿入データSqlBulkCopyクラスコードは次のとおりです。
1.まず、データベース内のUserクラスに対応するユーザーテーブルを作成します。
1つのパブリッククラスユーザ 2 { 3パブリックユーザ() 4 { 5 6} 7パブリック文字列ユーザー名{得ます。セット; } 8パブリック文字列のパスワード{得ます。セット; } 9つのパブリック列アドレス{得ます。セット; } 10パブリック文字列電話{得ます。セット; } 11}
ユーザーデータベースのテーブル構造:
2.保存されたデータテーブルは、データの1万方法を返さ作成します。
1保護されたデータテーブルGetDataTableData() 2 { 3一覧<ユーザー> USERLIST =新しいリスト<ユーザー>(); 図4は、のために(INT i = 0; I ++; iは10000 <) 5 { )(6ユーザのユーザ=新しいユーザーを、 7 user.UserName = "zhangsan"。 8 user.PassWord = "123456"。 9 user.Address = "北京路一号"。 10 user.Telephone = "13232323232"。 11 userList.Add(ユーザ)。 12} 13(データテーブルDT =新しいデータテーブル())を用いて 14 { 15 dt.Columns.Add( "ユーザー名"、typeof演算(文字列))。 16 dt.Columns.Add( "パスワード"、typeof演算(列))。 17 dt.Columns.Add( "住所"、typeof演算(文字列)); 18 dt.Columns.Add( "電話"、typeof演算(列))。 19 foreachの(ユーザリスト内のユーザのユーザ) 20 { 21のDataRow DR = dt.NewRow()。 22 DR [ "ユーザー名"] = user.UserName。 23 DR [ "パスワード"] = user.PassWord。 24 DR [ "住所"] = user.Address。 25 DR [ "電話"] = user.Telephone。 26 dt.Rows.Add(DR)。 27} 28リターンDT。 29} 30}
3.ページ上のボタンは、あなたがデータ挿入操作用のボタンをクリックすることができ、次のように、ボタンのクリックイベントのコードは次のとおりです。
。のButton1 Click 1(SENDERオブジェクト、のEventArgs E)ボイド保護 2 { 3列コンストラクタConfigurationManager.ConnectionStrings = [ "コンストラクタ"]のConnectionString ;.。 4 = SqlConnectionの新しい新しい接続SqlConnectionオブジェクト(コンストラクタ);。 。5試みは 6 { 7(使用= SqlBulkCopy新しい新しいバルク・コピーSqlBulkCopy。 (コンストラクタ、SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction)) 8 { 9 bulkCopy.DestinationTableName = "dboが[ユーザー]"; //ターゲット表、あなたがするテーブルにデータを挿入することを 10 bulkCopy.ColumnMappings.Add (「ユーザー名」、「ユーザー名」 ); //データ・ソースとターゲットテーブルの列名との間の属性マッピング 11 bulkCopy.ColumnMappings.Add(「パスワード」、「パスワード」)。 12 BulkCopy.ColumnMappings.Add( "アドレス"、 "住所")であり 、13はbulkCopy.ColumnMappings.Add( "電話"、 "電話")で 14 GetDataTableDataデータテーブルDT =(); //データソース 15 //バルク・コピー。 。= 3のBatchSize; 16ストップウォッチストップウォッチ(=ストップウォッチ新しい新規); //ストップウォッチ、そのような統計は時間であってもよい 17 stopwatch.Start(); //ストップウォッチ開始 18 bulkCopy.WriteToServer(dt)を; //データソースターゲット表にデータを書き込む //エンドストップウォッチは、までの経過時間の統計値; 19のResponse.Writeは、(+ stopwatch.Elapsed「使用時間データを挿入する」) 20である} 21である} 22は、キャッチ(例外EX)である 23は{ 24新しい例外(ex.Message)を投げます。 25} 26のResponse.Write( "成功したインサートを<BR/> !!!"); 27}
次のようにステートメントの挿入コードでのSQLServer一括で挿入データは以下のとおりです。
1.まず、1万データを挿入データを挿入し、まったく同じデータSqlBulkCopyを挿入するストアドプロシージャを作成します。
1 PROC USP_InsertUserTable CREATE AS 2 BEGIN 3 @iがint 4 DECLAREを I = 1 @ 5 SET 6 WHILE @i <10001 7開始 DBO INTO 8 INSERTを[ユーザー] 9(ユーザ名、 10パスワード、 11のアドレス、 12電話番号 13) 14 VALUES(N'zhangsan」、 -ユーザ名- NVARCHAR(50) 15 N'123456' 、 -パスワード- NVARCHAR(6) 16 N '北京路一号'、 -アドレス-データ型はnvarchar(50) 17 '13232323232' -電話- VARCHAR(11) 18) 19 I = @ I + 1 @ 20 SET 21 END 22 END
2.ストアドプロシージャを実行します。
EXEC dbo.USP_InsertUserTable
次のようにINSERTステートメントを指定してSqlBulkCopy効率試験の比較は次のとおりです。
SqlBulkCopy時間を過ごした統計(5回):
:TSQL_Durationを使用してテンプレートをテストするには、「SQL Serverプロファイラ - SqlServerのINSERT文は、ツールを使用して、(5)時間統計を費やしてきました
もう一つ注意すべき:テストの実施に影響を与えないように、次のように挿入文または動作SqlBulkCopyかどうか、各テストの前にバッファをクリーンアップし、元のデータを削除するために行われる必要があります。
DBCC DROPCLEANBUFFERS
DBCC FREESYSTEMCACHE( 'ALL')
DBOを削除します。[ユーザー]
結論:上記のテストの統計分析は、それを見ることができるSqlBulkCopy大規模なデータ挿入操作のパフォーマンス効率INSERT文よりもはるかに効率的です。