6

パラメータ化されたクエリを使用してデータをテーブルに挿入するのはなぜですか。

string queryString = "insert into product(id, name) values (@id, @name)";

クエリ文字列に値を追加するよりも高速です。

string queryString = "insert into product(id, name) values (" + _id + ", " + _name + ")";

このコマンドをループで使用して10K行を挿入すると、パラメーター化されたクエリは他のクエリよりも桁違いに高速になります。

パラメータ化されたクエリにはセキュリティと保守性の利点があることを知っています。これが推奨される使用方法ですが、なぜこれほど高速なのかについての説明に興味があります。

4

5 に答える 5

8

一般に、SQL クエリの実行で最もコストがかかる部分は、実行計画の作成です。必要になるテーブルを特定し、使用するのに最適なインデックス (存在する場合) を決定するなどです。よろしければお問い合わせください。

パラメーター化されたクエリを使用すると、一度準備してから、さまざまなターゲット値を差し込むだけで済みます。異なるデータで同じ操作なので、毎回実行計画を再構築する必要がありません。「コンパイル」の比喩を拡張すると、これは、同じプログラムを別の構成ファイルで再実行するようなものです。

ただし、値を追加すると、クエリにハードコーディングされるため、毎回再準備する必要があり、反復ごとに新しい実行プランを作成するコストが発生します。再び「コンパイル」の比喩を使用すると、これはすべての構成がハードコーディングされた C プログラムのようなものです。1 つの設定を変更すると、すべてを再コンパイルする必要があります。

(一括挿入を実行するときに発生する可能性のあるその他の主要なコストは、インデックスの更新です。テーブルにインデックスが付けられている場合は、それらをオフにして挿入を実行し、再度オンにして、インデックスを一度だけ再作成する必要がある場合があります。各行が追加された後ではなく)。

于 2009-12-05T10:55:38.563 に答える
5

単純。クエリの実行プランの解析と準備は、クエリの実行が開始される前であっても、多くの時間がかかります。

パラメータをテキストとしてクエリに追加する場合、クエリはそれぞれ異なるため、DBはそれを解析して実行プランを準備する必要があります。

パラメータを使用すると、同じクエリを何度も(異なるデータで)送信することになり、DBは以前の呼び出しの実行プランを簡単に再利用できます。

ほとんどの場合、それは単にクエリ間のテキスト比較です。たとえば、MS SQL Serverでは、文字の大文字と小文字を変更するか、クエリの最後にスペースを追加して、DBに実行プランを再作成させるだけで十分です。

于 2009-12-05T10:44:33.243 に答える
4

使用しているDBによっては、通常の理由は、パラメーター化されたクエリを1回コンパイルするだけでよく、動的クエリのバージョンは使用するたびに再コンパイルされるためです。

于 2009-12-05T10:41:03.340 に答える
3

これは、データベースがクエリプランをキャッシュしているため、クエリプランが高速化されているためです。

SQLサーバーについては、この説明を参照してください

実行計画のキャッシュと再利用

于 2009-12-05T10:39:36.327 に答える
0

複数の値を使用した場合、おそらく高速ではありません
1000まで実行できます

string queryString = "insert into product(id, name) values " + 
"   (" + _id  + ", " + _name  + ")" + 
" , (" + _id1 + ", " + _name1 + ")" + 
" , (" + _id2 + ", " + _name2 + ")"; 
于 2016-09-28T14:57:17.007 に答える