1

次のコードを想定します。

public void ExecuteSomeSql(string sql, SqlConnection sqlConnection)
{
  etc etc
}

allSqlそして、 = sql1+ sql2+と仮定しsql3ます。

パフォーマンスに違いはありますか?

シナリオ 1

ExecuteSomeSql(allSql, sqlConnection);

シナリオ 2

ExecuteSomeSql(sql1, sqlConnection);
ExecuteSomeSql(sql2, sqlConnection);
ExecuteSomeSql(sql3, sqlConnection);

SQL が同じ接続を介して複数回実行されたときに何が行われるかはよくわかりません。すでにアクティブな接続があるため、おそらく複雑なハンドシェイクはありません。

シナリオ 2 よりもシナリオ 1 を優先すべき強い理由はありますか?

(コンテキストとして、私の質問は、C# でいくつかのビジネス ルールを実装できるかどうか、または (パフォーマンスが重要であるために) 単一の SQL コマンドですべてを実行する必要があるかどうかを実際に推進しています。)

4

1 に答える 1

0

実行している操作に大きく依存すると思います。1 つのレコードを挿入する場合、実行内容に大きな違いはありません (ただし、セキュリティのためにパラメーター化されたクエリを使用し、exec プランをキャッシュできるようにする必要があります)。10 個のレコードを挿入する場合、セミコロンで区切られた 10 個のステートメントを含む SQL の文字列を 1 つ送信することでそれを行うことができますが、パラメーターを使用することはできません (または、使用した場合は 10x のパラメーターが必要になります。x はフィールドの数です)。挿入している)、パラメータ化されたクエリを使用することをお勧めします。100 個の挿入が必要な場合は、パラメーター化されたクエリを実際に使用する必要があります。1000 個の挿入が必要な場合は、おそらく SqlBulkCopy クラスを使用する必要があります

全体として、パラメーター化されたステートメントを使用しない正当な理由はありません。「SQL は動的だから」という理由でそれらの使用に反対する人でさえ、パラメーター化された SQL 文字列を構築し、ループ内でパラメーター コレクションを設定することはもちろん、文字列を連結することもできます。

SQL のパフォーマンスを向上させる方法を探している場合は、例の SQL の内容についてさらに投稿する必要があります。単一の列に単一の文字を100万回挿入している場合、間違いなく1つのパラメーター化されたクエリを使用してSQLを記述し、パラメーターを追加し、クエリを実行してから(パラメーター値を変更して再実行します)、さらに999999回SqlCommandText を 100 万回設定し、実行するたびにテキストをサーバーに再度送信するよりも間違いなく高速です。おそらく、100 万個の連結された「insert into a(a) values('a');」を含む 30 メガバイト以上の文字列をサーバーが受け入れることは決してないでしょう。元の質問の文字列 concat sql1 + sql2 ... + sql1000000に相当するとんでもない極端なステートメント

クエリされている問題を解決するには (質問されている質問に答えるのではなく) パラメータ化されたクエリを使用し、クエリとパラメータ コレクションを 1 回作成し、パラメータ値を変更しますが、N 回必要です.. または.. 操作が本当に大量である場合は、そのために最適化されたクラスを使用します(例:SqlBulkCopy)

sql1、2、3 がすべて異なる種類の操作である場合は、3 つのステートメントを用意し、クライアントで必要な回数だけ変更して実行します。SqlCommandText ごとに複数のステートメントを実際に使用するのは、「INSERT INTO... SELECT SCOPE_IDENTITY()」のようなものを使用して、自動番号などの計算値を取得する場合だけです。

于 2013-03-07T11:24:44.457 に答える