1

時々多くの行を追加しなければならないテーブルが 2 つあります。最後のケースは、テーブル 1 に 800000 行、テーブル 2 に 3 倍以上ありました。

テーブルに自動IDフィールドがあり、外部キー関係があることを考慮して、一括コピーを使用する方法がわからないため、次のストアドプロシージャを使用して行を挿入します。

CREATE PROCEDURE dbo.AddOrderBookEntry 
 @Moment datetime,
 @LocalTime datetime,
 @BB decimal(18,4),
 @BO decimal(18,4),
 @QBB float,
 @QBO float,
 @SumTr float = NULL,
 @QSumTr float = NULL,
 @IV float = NULL,
 @InstrumentId bigint,
 @AverageValues Averages READONLY
AS
BEGIN
 INSERT INTO dbo.OrderBook
 VALUES (@Moment,@LocalTime,@BB,@BO,@QBB,@QBO,@SumTr,@QSumTr,@IV,@InstrumentId)

 DECLARE @OBID bigint
 SELECT @OBID = SCOPE_IDENTITY()

 INSERT INTO dbo.OrderbookAverages
 select N, BN, [ON], @OBID from @AverageValues

END
GO

動作しますが、気になるのは速度です。私の測定によると、レコードが追加されるまでに app 1.75 ミリ秒かかります。データを db に書き込む .net アプリケーションの速度を測定しています。このアプリケーションは、SQL Server と同じコンピューター上にあります。

質問は、この速度は私が使用するアプローチで大丈夫ですか? それとも改善できますか?

4

2 に答える 2

0

多くの場合、非常に多数の行をビジネス コードからデータベースに送信する必要があります。それにはいくつかの方法があります。

データ全体に対して一度に 1 行ずつ挿入ステートメントを呼び出します。 データをフラットな形式 (CSV または XML) にシリアル化し、大きな文字列としてストアド プロシージャに送信し、ストアド プロシージャ TSQL で文字列をシリアル化解除して、挿入を実行します。データをデータベース サーバーにフラット ファイル形式で保存します。DTS パッケージなどを実行してファイルを読み込みます。SqlBulkCopy!

SqlBulkCopy を発見して以来、ずっと気に入っています。MS SQL Server には、あるサーバー上のあるテーブルから別のテーブルへ、またはサーバー間でデータを移動するための bcp と呼ばれる一般的なコマンドが含まれています。SqlBulkCopy は、同様の機能を提供するクラスです。

SqlBulkCopy は、複数の挿入ステートメント、データのシリアル化/逆シリアル化、またはデータのファイル システムへの保存とインポートの実行よりもはるかに高速です。また、送信できるデータに制限がなく、挿入を処理する方法が非常に効率的です。

これは、それを使用する方法がいかに簡単かです。この例では、DataTable のコピーを「tblFooBar」という MS SQL データベース テーブルに書き込む関数があります。

 using System.Data.SqlClient;
…

Function WriteToDB(DataTable dt)

{

    SqlBulkCopy sqlBC = new SqlBulkCopy(dbconnectionstring);

    sqlBC.BatchSize = 25000;

    sqlBC.BulkCopyTimeout = 60;

    sqlBC.DestinationTableName = “dbo.tblFooBar” ;

    sqlBC.WriteToServer(dt);

}
…

MSDN リンクは次のとおりです。

一括挿入の詳細へのリンク

于 2013-05-29T07:32:16.947 に答える