0

C#/MVCアプリケーションのSQLサーバーにレコードを挿入する効率的な方法を探しています。誰もが最良の方法が何であるか知っていますか?

通常、私はwhileループと挿入ステートメントを実行しましたが、処理するレコードがそれほど多くありませんでした。約50万を挿入する必要があり、whileループを使用して1分間に300行で、一日中ここにいます。

私がやっていることは、大きな保持テーブルをループし、その行を使用して別のテーブルにレコードを作成することです。新しいテーブルに必要なルックアップデータ用の関数をいくつか設定しましたが、これは間違いなくドレインに追加されます。

これが私が持っているクエリです。大量のデータに対しては非常に非効率的です。

Declare @HoldingID int
Set @HoldingID = (Select min(HoldingID) From HoldingTable)

While @JourneyHoldingID IS NOT NULL
Begin
    Insert Into Journeys (DepartureID, ArrivalID, ProviderID, JourneyNumber, Active)
    Select 
        dbo.GetHubIDFromName(StartHubName), 
        dbo.GetHubIDFromName(EndHubName), 
        dbo.GetBusIDFromName(CompanyName), 
        JourneyNo, 1
    From Holding
    Where HoldingID = @HoldingID

    Set @HoldingID = (Select MIN(HoldingID) From Holding Where HoldingID > @HoldingID)
End

セットベースのアプローチについて聞いたことがあります-上記の問題に役立つ可能性のあるものはありますか?

4

4 に答える 4

5

MSSQL Serverに大量のデータを挿入する場合は、一括挿入を使用する必要があります。これには、 bcpユーティリティと呼ばれるコマンドラインツールと、一括コピー操作を実行するためのC#ラッパーがありますが、これらはすべてを使用してBULK INSERTいます。

アプリケーションによっては、最初にデータをステージングテーブルに挿入してから、MERGEまたはINSERT INTO SELECT...それらの行をステージングテーブルからターゲットテーブルに転送することをお勧めします。データが多い場合は、少し時間がかかりますが、挿入を個別に実行するよりもはるかに高速になります。

これを高速化したい場合は、リカバリモデルの変更や、トリガーとインデックスの微調整/削除(これがライブデータベースであるかどうかによって異なります)など、さまざまなことができます。それでも本当に遅い場合は、このプロセスをバッチで実行することを検討する必要があります(たとえば、一度に1000行)。

于 2012-10-17T16:32:49.927 に答える
3

これはまさにあなたが今していることであるはずです。

Insert Into Journeys(DepartureID, ArrivalID, ProviderID, JourneyNumber, Active)
Select 
    dbo.GetHubIDFromName(StartHubName), 
    dbo.GetHubIDFromName(EndHubName), 
    dbo.GetBusIDFromName(CompanyName), 
    JourneyNo, 1
From Holding
ORDER BY HoldingID ASC
于 2012-10-17T17:03:01.217 に答える
1

あなたは(おそらく)フォームの1つのステートメントでそれを行うことができます

INSERT INTO JOURNEYS
SELECT * FROM HOLDING;

スキーマに関する詳細情報がなければ、絶対に確信することは困難です。

于 2012-10-17T16:40:21.017 に答える
0

SQLServer 2008では、テーブルパラメーターが導入されました。これらを使用すると、データベースへの1回のトリップで複数の行を挿入できます(大きなblobとして送信します)。一時テーブルを使用せずに。この記事では、その仕組みについて説明します(記事のステップ4)

http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

特別なユーティリティを必要とせず、すべての制約と外部キーがチェックされるという点で、一括挿入とは異なります。

これを使用して、インサートを並列化することで、スループットを4倍にしました。現在、同じテーブルで15.000挿入/秒が維持されています。インデックスと10億行を超える通常のテーブル。

于 2012-10-17T19:19:34.637 に答える