私は準備された声明について多くのことを読んできました。私が読んだことのすべてにおいて、誰もそれらを使用することの欠点について語っていません。だから、人々が見落としがちな「龍がいる」という斑点があるのだろうか?プリペアドステートメントを使用することには欠点がありますか?
答えて
プリペアドステートメントは、バインドされた変数が実行されるのを待っているだけの、あらかじめコンパイルされたプリコンパイル済みのステートメントです。SQL
実行されたステートメントは、遅かれ早かれ準備されます(解析、最適化、コンパイルして実行する必要があります)。
準備されたステートメントは、解析、最適化、およびコンパイルの結果を再利用するだけです。
通常、データベースシステムでは、準備されたクエリを自分で使用しなくても、クエリ準備に時間を節約するために、ある種の最適化を使用します。
Oracle
たとえば、クエリの解析でライブラリのキャッシュが最初にチェックされ、同じ文がすでに解析されている場合は、代わりにキャッシュされた実行計画が使用されます。
私はこの答えは、準備されたステートメントとの重要な問題がないと思う、例えば。クエリプランが、クエリが準備された時点で存在するデータ統計に従って最適化され、将来クエリが実行されるときには最適でない可能性があります。したがって、これは準備された声明の欠点です。 – egbokul
同様の欠点を記述した記事:https://medium.com/@devinburnette/be-prepared-7768d1a111e1 ---および--- https://www.vividcortexcom/blog/2014/11/19/analyze-prepared-statement-performance-with-vividcortex/ – MarsAndBack
あなたは一度だけの文を使用している場合、または自動的に(いずれか適切everythinをエスケープするか、パラメータのみ安全な文字を持っている特定のために知っている)、あなたはプリペアドステートメントを使用してはならない動的SQL文を生成する場合。
もちろん、これは非常にまれです。私は、入力側の墨塗りを行うだけで、サーバー側で準備された声明文を持っているほうがずっと簡単です。 – Powerlord
私が考えることができる唯一の欠点は、サーバー上でメモリを占有することです。それほど大したことではありませんが、おそらくいくつかの問題がありますが、何かを考えるのは難しいでしょう。
準備された文と動的SQLのもう1つの小さな問題があります。それは、それらをデバッグするのが難しくなる可能性があるということです。動的SQLでは、問題のクエリを常にログファイルに書き出し、プログラムが見ているとおりにサーバー上で直接実行することができます。プリペアドステートメントを使用すると、クラッシュデータから特定された特定のパラメータセットを使用してクエリをテストするのに少し時間がかかります。しかし、それほど多くはありません。余分なセキュリティがコストを正当化することは間違いありません。
状況によっては、準備された文を使用しているときにデータベースエンジンが下位のクエリプランを作成することがあります(実際のバインド値を検索せずに正しい仮定を立てることができないため)。
http://www.postgresql.org/docs/current/static/sql-prepare.html
の「注意事項」セクションには、それはとし、より高速であるかを調べるために書類を作成せずにクエリをテストする価値があるかもしれません。理想的には、プリペアドステートメントを使用するかどうかをステートメントごとに決定しますが、すべてのORMでそうすることはできません。
私は、最良のパターンは、準備されたステートメントへのすべてまたは何もアプローチを使用することであることがわかりました。 DBMSは、ほとんどの人よりもスマートで、ほとんどの場合、最良のプランを見つけることができます。また、異なるDBMSには異なるクエリプランの戦略があることを知っているので、準備されたステートメントのリンクをキャッチオールとして使用しないでください。 DBMSをWeb作業に使用している場合、SQLインジェクション攻撃から防御する最も迅速かつ簡単な方法は、常に準備済みの文を使用することです。 – bakoyaro
- 1. GCCで-O3を使用することに欠点はありますか?
- 2. -Bsymbolic-functionsの使用には欠点がありますか?
- 3. NetBeansでAndroid用に開発することに欠点はありますか?
- 4. AJAXをRIAとして使用することには何らかの欠点がありますか?
- 5. 2つのWSUSサーバーを使用することには何らかの欠点がありますか?
- 6. リリースビルドのデバッグシンボルを残すことには欠点がありますか?
- 7. 速度モデルにパーシネーションオブジェクトを使用することには欠点はありますか?
- 8. チェインセッター:欠点はありますか?
- 9. sqlクエリに変数がないときにPDOでプリペアドステートメントを使用する利点があります
- 10. SQLクエリでエイリアスを使用しないと欠点はありますか?
- 11. SEAMには何らかの欠点がありますか?
- 12. プロキシキャッチサーバーを使用する利点と欠点は何ですか?
- 13. WebアプリケーションでThreadPool.QueueUserWorkItemを使用する場合の欠点はありますか?
- 14. ObjCファイルを作成することはありませんが、常にObjC++ファイルを作成することには欠点がありますか?
- 15. 同じ値を上書きすることには何らかの欠点がありますか?
- 16. BaseAdapterの匿名インスタンスを作成することには何らかの欠点がありますか?
- 17. すべての継承を仮想化することには欠点がありますか?
- 18. ビジュアルスタジオ2010でSQLサーバーの代わりにMYSQLを選択することに欠点はありますか?
- 19. JavaScriptで匿名関数を使用する際に欠点はありますか?例えば。メモリ使用?
- 20. AbstractBaseClasses(ABC)をコピー不可能から派生させることには欠点がありますか?
- 21. ローカルレポートにはリモートレポートと比較して欠点がありますか?
- 22. アンドロイドアプリケーションでアクティビティごとに別々のテーマを使用する場合の欠点はありますか?
- 23. CakePHPでヘルパーからモデルを呼び出すことには欠点がありますか?
- 24. typescriptで常に.tsxの代わりに.tsxを使用することには何か欠点がありますか?
- 25. プリミティブでないオブジェクトに「使用する」という欠点がありますか?
- 26. アプリケーションデータベースを使用パターンで分けることに利点はありますか?
- 27. ジーンベント:多くのグリーンレッツ産卵に欠点はありますか?
- 28. DATE列の代わりにIDを使用する場合の欠点はありますか?
- 29. Draw SOMETHINGのようなゲームを開発するためにRedisデータベースを使用することには何らかの欠点がありますか?
- 30. APIを中心としたウェブサイトにスピードの欠点がありますか?
ITのすべてには欠点があります。特定の問題で本当に心配する価値があるかどうかを確認するだけです。 :) SOのこのリンクhttp://stackoverflow.com/questions/535464/when-not-to-use-prepared-statements/537834準備されたステートメントの欠点に関するいくつかの例があります。 – GmonC