ADO.NETコールストアドプロシージャを効率的に呼び出します -- c# フィールド と database フィールド と stored-procedures フィールド と ado.net フィールド と bulkinsert フィールド 関連 問題

ADO.NET Call stored procedure efficiently












1
vote

問題

日本語

私はdbテーブル内のエントリを挿入/更新するストアドプロシージャを持っています。 私はまた、毎秒をDBに渡す必要があるWebサービスを持っています。

私は大きなパフォーマンスへの影響なしにこれを達成したいですが、私は問題に最適な方法がどのようにアプローチするかわからない。

これは私のコードです(できるだけ簡略化されています)

*注:ストアドプロシージャが使用するパラメータの1つがDBからカスタムユーザー定義テーブルタイプの1つであるため、DataTableを使用します。

<事前> <コード> public class DBWorker { public void Update(IEnumerable<UpdateModel> updates) { using (SqlConnection connection = new SqlConnection(this._connectionString)) using (SqlCommand command = new SqlCommand(this._storedProcedureString, connection) { CommandType = CommandType.StoredProcedure }) { foreach (var update in updates) { command.Parameters.Add("@EntryID", SqlDbType.Int).Value = update.EntryID; command.Parameters.Add("@Type", SqlDbType.Int).Value = update.Type; DataTable dataTable = new DataTable(); dataTable.Columns.Add("ParamID"); dataTable.Columns.Add("Value"); DataRow row = dataTable.NewRow(); row["ParamID"] = update.ParamID; row["Value"] = update.Value; dataTable.Rows.Add(row); command.Parameters.Add("@NameValues", SqlDbType.Structured).Value = dataTable; command.ExecuteNonQuery(); } } } } public class UpdateModel { public int EntryID { get; set; } public int Type { get; set; } public int ParamID { get; set; } public string Value { get; set; } }

私の主な関心事は、上記のコードがすべての更新のためにクエリを作成し、多くのアップデートがある場合はDPを劇的に遅くすることです。いくつかの「 bulk 」モードでストアドプロシージャを呼び出すことができる方法はありますか。

私は私の結果のすべての結果を使ってデータを作成することを考えていました、そして、それからそれをストアドプロシージャにそれを渡すことを何を渡していましたが、これが実際のパフォーマンスの向上を持つかどうかもよくわかりません。それが問題になっているかどうかわからないが、これはSPが実際に更新されるテーブルの構造です。

  • ID - int、ID、PK
  • entryid - int、notnull
  • type - int、notnull
  • paramid - int、notnull
  • value - varchar、notnull
英語

I have a stored procedure that inserts/updates entries in a DB table. I also have a web service that needs to pass a lot of new updates every couple of seconds into the db.

I want to accomplish this without a major performance impact, however I am not sure how to best approach the issue.

Here is my code (simplified as much as possible)

*Note: I use the datatable since one of the params that the stored procedure uses is a custom User-Defined table type from the DB.

public class DBWorker {     public void Update(IEnumerable<UpdateModel> updates)     {         using (SqlConnection connection = new SqlConnection(this._connectionString))         using (SqlCommand command = new SqlCommand(this._storedProcedureString, connection) { CommandType = CommandType.StoredProcedure })         {             foreach (var update in updates)             {                 command.Parameters.Add("@EntryID", SqlDbType.Int).Value = update.EntryID;                 command.Parameters.Add("@Type", SqlDbType.Int).Value = update.Type;                  DataTable dataTable = new DataTable();                 dataTable.Columns.Add("ParamID");                 dataTable.Columns.Add("Value");                 DataRow row = dataTable.NewRow();                 row["ParamID"] = update.ParamID;                 row["Value"] = update.Value;                 dataTable.Rows.Add(row);                  command.Parameters.Add("@NameValues", SqlDbType.Structured).Value = dataTable;                 command.ExecuteNonQuery();             }         }     } }  public class UpdateModel {     public int EntryID { get; set; }      public int Type { get; set; }      public int ParamID { get; set; }      public string Value { get; set; } } 

My main concern is that the above code will make a query for every update and will dramatically slow down my DP if i have a lot of updates. Is there any way I can call the stored procedure in some "bulk" mode.

I was thinking of creating a datatable with all my results and then somehow passing that to the stored procedure but I am not sure if this will have an actual performance improvement, nor have an idea of how to implement it.

Not sure if it matters but this is the structure of the table that the SP actually updates:

  • ID - int, identity, PK
  • EntryID - int, notnull
  • Type - int, notnull
  • ParamID - int, notnull
  • Value - varchar, notnull
</div
              

回答リスト

1
 
vote
vote
ベストアンサー
 

ここで右の道を降りているが...

  1. データテーブルを作成し、単一の行を追加し、データテーブルをストアドプロシージャに渡します。 UpdateModelごとに。アップデートごとに(アップデートオブジェクトのプロパティから4つの列すべての列を持つ)、更新ごとに行を作成する方がよく、DataTable(現在は多くの行)をSPに渡します。
  2. そのコマンドで何が起こっているのかについて考えてください - 特に追加するパラメータが追加される可能性がある(ループの周りに移動するたびにパラメータを再追加することを考える)。
  3. DataTableの列に明示的なデータ型
  4. に列を付ける

    更新の順序、20行、4列、1つの構造化引数を持つコマンドを持つデータ可能性を持ち、SPを1回呼び出すことができます。

 

Your going down the right road here, but...

  1. You're creating the datatable, adding a single row, and passing the datatable to the stored procedure. For each UpdateModel. Better to create a row per update (with all four columns - from the properties of your update object), then pass the datatable (now with many rows) to the SP.
  2. Think about what's going on with that command - specifically how may parameters you will add (given that you're re-adding the parameters every time you go around the loop).
  3. Give the columns in the datatable some explicit datatype

For the sequence of updates, say 20, you want to have a datatable with 20 rows, four columns, a command with one structured argument, and call the SP once.

</div
 
 
       
       

関連する質問

16  一括挿入レコードをアクティブレコードテーブルに挿入します  ( Bulk insert records into active record table ) 
私は私が一度に多数のレコードを追加したときに実行に非常に長い時間をかけていることを見つけました。 activerecord-import を見ましたが、ハッシュの配列では動作しませんでした(これは私が持っているものです。私はかなり一般的だと思います)。どのよ...

23  CSVからのSQLバルクインポート  ( Sql bulk import from csv ) 
大規模なCSVファイルをSQL Serverにインポートする必要があります。私はこれを使っています: <事前> <コード> BULK INSERT CSVTest FROM 'c:csvfile.txt' WITH ...

8  DB表1からデータを選択し、PHPの別のDB表2に挿入します。  ( Select data from db table 1 and insert it into another db table 2 in php ) 
2つの異なるデータベース、名前: DBTEST:表1 DBTEST2:表2 DBTEST表1からDBTEST2へのすべてのデータと新しいエントリを選択したい。 私はこれを試してみました <事前> <コード> $sqlfin = "INSERT I...

11  多数のオブジェクトを持つJSONファイルからMongoDBをバルクロードする  ( Bulk loading mongodb from json file with a number of objects ) 
MongoDBにバルクロードをしたいです。ロードしたいJSONオブジェクトを含む200GBのファイルがあります。問題は、オブジェクトには、4MBに制限されているオブジェクトが含まれているものとしてMongoImportツールを使用できません。 Couch...

0  Performance SQLiteの問題 - CodeChangeは物事をスピードアップすることができますか?  ( Performance sqlite issue can a codechange speed up things ) 
データベースに行を追加するには、次のコードを使用します。 <事前> <コード> X0 現在、この挿入()を3.455回呼び出して、 X1 を使用して、データベースにすべての単語を追加しています。それは永遠にかかります。 このコードを変更するにはどのようにして...

2  大部分のテーブル間で大規模なデータをバルクインサートで移動する  ( Move large data between tables in oracle with bulk insert ) 
私は100万行のデータを別のテーブルに移動したいです。 Query:を使用しているIM <事前> <コード> {"dateTimeFormat": "iso8601", "events" : [ {"start": "1924", ...

17  あるデータベースから別のデータベースに100000レコードを挿入する最速の方法は何ですか?  ( What is the fastest way to insert 100 000 records from one database to another ) 
私はモバイルアプリケーションです。私のクライアントには大きなデータセット~100.000レコードがあります。それは頻繁に更新されます。 同期すると、1つのデータベースから別のデータベースにコピーする必要があります。 2番目のデータベースをメインに添付し、<コ...

4  バルクデータをMySQLにインポートします  ( Import bulk data into mysql ) 
だから私はMySQLデータベースにいくつかの販売データをインポートしようとしています。データはもともと、PHPアプリケーションが最初にプロセスする必要がある生のCSVファイルの形式で、処理された販売データをデータベースに保存します。 最初は私は個々の INSE...

1  一般リストからDataTableを使用せずにSQLバルクインサートを使用する方法はありますか?  ( Is there a way to use sql bulk insert without using datatable from generic list ) 
私は一般的なリストを持っています約6百万以上が含まれています。この一般的なリストをSQLバルクインサートを使用してデータベースに挿入します。しかし、SQLバルクインサートを使用するにはデータテーブルが必要です。一般的なリストをDataTableに変換しすぎる時...

2  データベースにフラットファイルをロードするためにSSISまたはマルチスレッドC#アプリケーションを使用してください。  ( Should i go with ssis or multithreaded c sharp application to load flat files in ) 
SQL Server Integration Services(SSIS)の内側には、何百万レコードを保持できるフラットファイルへの接続を設定して、そのデータがSQL DBにプッシュされている可能性があります。さらに、このプロセスは、Microsoft.sq...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有