2009-08-04 8 views
1

定期的なSQLクエリを実行するベストプラクティスとは何でしょうか?私の理解は、パラメータ化されたクエリを使用して、最初の実行時に準備されたステートメントに変換することです。このクエリを複数のスレッドで実行する必要がある場合はどうなりますか?スレッドごとにクエリの種類ごとに準備されたステートメントを作成する必要がありますか? または、SQL文の構文解析が効率的なので、現在は準備済みの文が不要になりましたか?定期的なSQLクエリ

答えて

2

良い質問 - 一度に1ビットずつ回答。

  • 繰り返しSQLクエリを実行するためのベストプラクティスと考えられるものは何ですか?

パラメータの違いを除いてクエリが繰り返される場合は、prepared statementsを使用してください。

  • 私の理解では、パラメータ化クエリを使用し、最初の実行時に準備された文にそれを有効にすることです。

これは何をすべきかに関する私の意見です。古典的に言えば、アドバイスは、プログラムの開始時にすべてのクエリを準備することでした。私の見解では、これはいつもナンセンスでした。サーバはクエリを使用してサーバにオーバーロードされ、その多くは任意の実行では使用されず、クライアントとDBMSの両方でメモリを浪費します。オンデマンドでのステートメントの作成は、常に最も賢明でした。それが必要とされていない限りではありませんでした。私は「常に」実行されるステートメントの例外を許可したいと思いますが、「いつも」は本当に100%に近いと確信しなければなりません。このクエリは、複数のスレッドで実行する必要がある場合はどう

  • ?スレッドごとにクエリの種類ごとに準備されたステートメントを作成する必要がありますか?

これは、異なるスレッドがDBMSと通信する方法によって異なります。私がよく知っているDBMSでは、スレッドがすべて共有する単一の接続が存在する場合、単一の接続に対して一度だけ準備する必要があります。各スレッドに独自の接続がある場合は、スレッドごとに個別にステートメントを準備する必要があります。

  • それとも文はもはや必要で用意していない頃はとても効率的なSQL文の解析のですか?

マシンは高速です - はい。また、繰り返されないステートメントの場合、オーバーヘッドについて心配する価値はありません。しかし、クエリを数百万回実行しようとすると、それを数百万回準備するコストが加わることになります。また、データベースサーバーマシンは通常共有リソースですが、ステートメントはユーザーごとに別々に用意される可能性があります。それらの高速です。

私の答えは「いいえ」です。準備されたステートメントは、クエリが十分に頻繁に繰り返される場合にはまだ有益です。数百回 - 準備されたステートメントを使用してください。数十回 - おそらく準備されたステートメントを使用します。それより少ない - おそらく準備されたステートメントを使用しないでください。

+0

準備された文では、クライアントと同様にサーバー上のメモリが使用されることが多いことがわかっています。私は、各クエリが何回繰り返されたかというように、各クエリが行った作業負荷の割合を調べます。私はPreparedステートメントの使用と複雑なコードを作成する前に、数百回から数百回の使用に近いものを見ています。 –

2

まあ、使用している環境については言及していませんが、一般的には、ストアドプロシージャ(DBエンジンがサポートしている場合)を検討することもできます。データベース自体に抽象化レイヤーを追加するメリットがあるため、正確なデータベーススキーマはクライアントアプリケーションとの関連性が低くなります。

パフォーマンス向上のためだけでなく、SQLインジェクションに対するセキュリティとデータ型変換の問題(ローカライズされた日付時刻)を防ぐために、ほとんどの場合、パラメータ化されたクエリを使用することをお勧めします。