2009-09-01 8 views
12

私は準備された声明について多くのことを読んできました。私が読んだことのすべてにおいて、誰もそれらを使用することの欠点について語っていません。だから、人々が見落としがちな「龍がいる」という斑点があるのだろうか?プリペアドステートメントを使用することには欠点がありますか?

+0

ITのすべてには欠点があります。特定の問題で本当に心配する価値があるかどうかを確認するだけです。 :) SOのこのリンクhttp://stackoverflow.com/questions/535464/when-not-to-use-prepared-statements/537834準備されたステートメントの欠点に関するいくつかの例があります。 – GmonC

答えて

8

プリペアドステートメントは、バインドされた変数が実行されるのを待っているだけの、あらかじめコンパイルされたプリコンパイル済みのステートメントです。SQL

実行されたステートメントは、遅かれ早かれ準備されます(解析、最適化、コンパイルして実行する必要があります)。

準備されたステートメントは、解析、最適化、およびコンパイルの結果を再利用するだけです。

通常、データベースシステムでは、準備されたクエリを自分で使用しなくても、クエリ準備に時間を節約するために、ある種の最適化を使用します。

Oracleたとえば、クエリの解析でライブラリのキャッシュが最初にチェックされ、同じ文がすでに解析されている場合は、代わりにキャッシュされた実行計画が使用されます。

+3

私はこの答えは、準備されたステートメントとの重要な問題がないと思う、例えば。クエリプランが、クエリが準備された時点で存在するデータ統計に従って最適化され、将来クエリが実行されるときには最適でない可能性があります。したがって、これは準備された声明の欠点です。 – egbokul

+0

同様の欠点を記述した記事:https://medium.com/@devinburnette/be-prepared-7768d1a111e1 ---および--- https://www.vividcortexcom/blog/2014/11/19/analyze-prepared-statement-performance-with-vividcortex/ – MarsAndBack

3

あなたは一度だけの文を使用している場合、または自動的に(いずれか適切everythinをエスケープするか、パラメータのみ安全な文字を持っている特定のために知っている)、あなたはプリペアドステートメントを使用してはならない動的SQL文を生成する場合。

+3

もちろん、これは非常にまれです。私は、入力側の墨塗りを行うだけで、サーバー側で準備された声明文を持っているほうがずっと簡単です。 – Powerlord

1

私が考えることができる唯一の欠点は、サーバー上でメモリを占有することです。それほど大したことではありませんが、おそらくいくつかの問題がありますが、何かを考えるのは難しいでしょう。

3

準備された文と動的SQLのもう1つの小さな問題があります。それは、それらをデバッグするのが難しくなる可能性があるということです。動的SQLでは、問題のクエリを常にログファイルに書き出し、プログラムが見ているとおりにサーバー上で直接実行することができます。プリペアドステートメントを使用すると、クラッシュデータから特定された特定のパラメータセットを使用してクエリをテストするのに少し時間がかかります。しかし、それほど多くはありません。余分なセキュリティがコストを正当化することは間違いありません。

2

状況によっては、準備された文を使用しているときにデータベースエンジンが下位のクエリプランを作成することがあります(実際のバインド値を検索せずに正しい仮定を立てることができないため)。

http://www.postgresql.org/docs/current/static/sql-prepare.html

の「注意事項」セクションには、それはとし、より高速であるかを調べるために書類を作成せずにクエリをテストする価値があるかもしれません。理想的には、プリペアドステートメントを使用するかどうかをステートメントごとに決定しますが、すべてのORMでそうすることはできません。

+2

私は、最良のパターンは、準備されたステートメントへのすべてまたは何もアプローチを使用することであることがわかりました。 DBMSは、ほとんどの人よりもスマートで、ほとんどの場合、最良のプランを見つけることができます。また、異なるDBMSには異なるクエリプランの戦略があることを知っているので、準備されたステートメントのリンクをキャッチオールとして使用しないでください。 DBMSをWeb作業に使用している場合、SQLインジェクション攻撃から防御する最も迅速かつ簡単な方法は、常に準備済みの文を使用することです。 – bakoyaro

関連する問題