1

これはすぐに必要ですが、パフォーマンスとデザインの観点から何をお勧めしますか。

あなたが何かをする必要があるとき、何がより速くそしてより良いでしょうか?できるかどうか、できるかどうかを確認してください。または、直接試してみてください。失敗した場合は、実行方法を理解してください。

これは私の特定のケースです。foreachを使用して入力するデータベーステーブルがあります。テーブルには、表で繰り返すことができない主キーがあります。

それで..

foreach(object in Objects)
{
   bool exists = //SQL SELECT to check if exists.
   if (exists == false)
   {
      //SQL INSERT
      return INSERTED
    }
   else 
    {
     return failed
    }
}

また

    foreach(object in Objects)
    {
       try 
          {
          //SQL INSERT
          return INSERTED
           }
       catch
         {
        return FAILED
         }

    }

オーバーライドプロパティなしでファイルを作成し、実行を管理したり、試行する前にファイルが存在するかどうかを確認したりするなど、別の方法でこれのベストプラクティスを知りたいと思います。

更新: 回答に基づいて、パフォーマンスのために挿入ごとにトランザクションを実行するべきではないことがわかっています。バルクインサートを作成する必要があります。私のコードでは、私はこのような何かを持っています

//SQL Start Transaction
foreach
{
//SQL INSERT
}
//SQL Commit transaction

私の質問は、挿入する前に確認する必要があるのか​​、それとも単に試す必要があるのか​​、トランザクションの内部についてです。

4

3 に答える 3

3

例外はブール値よりもはるかに高い建設費がかかります。

いくつかの一般的なガイドラインは、実際には例外的な動作(通常のイベントとしては予期しない)の例外のみを使用し、プログラム制御に例外を使用しないようにすることです。

于 2013-01-30T04:43:07.623 に答える
1

C#を介した大量のデータベース操作は、非常に効果がなく、時間がかかります。これに近づくと、チェックの代わりに、通常、1つのクエリに挿入を構造化します。例えば:

"INSERT INTO sitemaps (link, site) 
 (SELECT ('" + NAME2 + "') as link, '" + SITE + "' as site 
   WHERE NOT EXISTS 
 (SELECT link FROM sitemaps 
    WHERE link = '" + NAME2 + "' and site='" + SITE + "')"

これにより、データベースの負荷が軽減され、コーディングが削減されます。

別のオプションとして、挿入のパフォーマンスを(文字通り数百回)向上させる非常に優れた方法は、BULK INSERT一時データベーステーブル(一度に数千のレコードに対して非常に高速)に(MS SQLのみ)を使用することです。次に、データベース側で、MERGEコマンドを使用して、更新、挿入、削除などを処理する方法をif-elseシナリオで記述します。4番目の部分を取り、それをデータベースの手続き型の最後に移動することは常に良い習慣です。

于 2013-01-30T02:30:11.867 に答える
0

これをC#で実行する場合HashSetは、主キーを作成し、それに対してオブジェクトをチェックしてから追加することをお勧めします。

注:との違いよりもはるかに低速になるため、挿入のたびにデータベースにクエリを送信しないようにする必要がありtry/catchますif

挿入を行う最も速い方法は、それらを単一のデータベース呼び出しにバッチ処理することです。

于 2013-01-30T03:03:10.980 に答える