0

データを移行して既存のシステムをクレンジングするために、.NET でカスタム ツールを作成する必要があります。また、他のことも行います。

私は文字通り約2000人のユーザーのテーブルを持っており、それらのユーザーごとに、0から9,000の「顧客アカウント」を持つことができます

次に、これらのユーザーとそのアカウントごとに、そのユーザーとアカウントの別のテーブルにメニュー システムを挿入する必要があります。

そのため、アプリ内で作成されたこれらすべてのオブジェクトを調べて、insert ステートメントを実行する必要があります。問題は、パフォーマンスがひどいことです。挿入を完了するのに 3.5 時間かかり、各挿入が完了するまでに約 3 秒かかりました....かなり遅いです!

挿入を使用して、重複データを挿入しないようにしています/既存の重複データがないことを確認しているため、挿入ステートメント:

 IF NOT EXISTS (SELECT ID FROM UserWebAccessLevel WHERE UserID = '{0}' AND CustomerID = '{1}' AND MenuID = {2}) BEGIN INSERT INTO [WebAccessLevel] (UserID, CustomerID, MenuID) VALUES ('{0}', '{1}', {2}) END 

各ユーザー、顧客、およびアプリ ロジック内の各メニュー項目に対してこれを行うと、長い時間がかかります。

挿入ステートメントのパフォーマンスを向上させるにはどうすればよいでしょうか?

ありがとうございました

4

1 に答える 1

1

テーブルにインデックスがないSELECT ID FROM...と、SQL Serverが各レコードを1つずつ確認し、WHERE句内のIDを比較する必要があるため、処理速度が低下する可能性があります。WHERE3つのIDを含むインデックスを追加することにより、SQL Serverは、句で3つのIDが指定されている場合に、既存のレコードを(多かれ少なかれ)即座に見つけることができます。

SQL Server Management Studioを使用していると仮定します:-

  • テーブルを右クリックし、[デザイン]をクリックします。
  • 列のリストが表示されている場所を右クリックし、[インデックス/キー]をクリックします。
  • 表示される次のダイアログで、[追加]ボタンをクリックします
  • rh側のプロパティのリストで、「列」と呼ばれるプロパティを見つけて、その右側のボックスをクリックします。省略記号ボタン( "...")が表示されたら、それをクリックします。
  • 表示される次のダイアログで、3つのID列を追加します。

インデックスは一意である必要はありません。[インデックス/キー]ダイアログで、一意にするかどうかを指定するオプションが表示されます。

私がチェックすることを提案できる他の唯一のことは、SQLを実行するC#/VBコードにありIF NOT EXISTS...ます-毎回接続を開いたり閉じたりしていないことを確認してください。それは本当に物事を遅くします!

于 2013-02-06T12:49:27.600 に答える