0

単一のレコードをテーブルに挿入してから終了するコマンド ライン ツール (Windows 7 ボックスで実行するため) を作成しています。C# (.NET 4.5) と SQL Server 2008 を使用しています。

データのレコードには、大きな (最大 6000 バイト) 文字列、タイムスタンプ、および自動インクリメント整数 ID プライマリ キーが含まれます。テーブルにアタッチされた外部キーはありません。

また、これはこのデータベースの最も一般的な使用シナリオであるため、最適化したいと考えています。個々の挿入時間を低く抑えるのに役立つデータベースのセットアップ方法に関するトリックはありますか?

[編集] 現在使用しているコード...

SqlConnection con = new SqlConnection(ConnectionString);
con.Open();
SqlTransaction trans = con.BeginTransaction();

SqlCommand cmd = new SqlCommand("INSERT INTO [msglog](message,project,username,computername,updated_at) VALUES (@m,@p,@u,@c,@i,@t)", con, trans);
cmd.Parameters.AddWithValue("@u", Username);
cmd.Parameters.AddWithValue("@c", Computername);
cmd.Parameters.AddWithValue("@m", msg);
cmd.Parameters.AddWithValue("@p", ProjectName);
cmd.Parameters.AddWithValue("@t", DateTime.Now);
cmd.ExecuteNonQuery();
trans.Commit();
4

3 に答える 3

2

私の提案は、データベースに接続する Windows サービスを作成することです。アプリケーションはサービスにメッセージを送信し、サービスはデータベースの更新を非同期に送信します。他の回答は、パフォーマンスを向上させるための SQL 側の良い方法を示しています。

于 2012-10-22T15:41:36.877 に答える
2

あなたのコード例では、ほとんどの時間が SQL Server への接続の確立に費やされていると思います。私がお勧めします:

  • 接続/アプリケーションの単一インスタンスの再利用を試みます。あなたの質問は、アプリケーションが開き、レコードを挿入してから終了することを示唆しています。これには、アプリケーション自体を起動する際のオーバーヘッドは言うまでもなく、1 つのステートメントに対して常に新しい接続を再確立する必要があります。
  • トランザクションを削除します (単一のステートメントには必要ありません)。
  • ステートメントの単一の文字列を構築しようとすることを気にしないでください。パラメータを使用する必要があり、パラメータを使用する方が高速になる可能性があります。SQL Server は、(パラメーター値を変更して) 同一のクエリの実行プランをキャッシュする可能性が高くなります。
  • テーブルの挿入を高速化します (RedFilter には、ここでいくつかの優れた提案があります)。挿入が常にテーブルの一方の端にあるように、理想的には増分キーでテーブルをクラスター化することを付け加えます。

他にもマイクロ最適化があるかもしれませんが、上記の最初の懸念事項に実際に対処することで、最も大幅なスピードアップが得られます。

于 2012-10-22T14:38:49.700 に答える
1

挿入先のテーブルでこれらを可能な限り排除します。

  • 通常の索引
  • 全文索引
  • トリガー
  • 持続計算カラム

また、このテーブルを使用するインデックス付きビューがないことを確認してください。

于 2012-10-22T14:07:40.217 に答える