JDBC のプリペアドステートメントがステートメントよりも高速な理由
JDBC のプレパアドステートメントがステートメントより高速な理由は以下の通りです
- プリコンパイルは、SQL文を中間形にコンパイルすることで、実行前に準備文を準備するものです。この中間形にはクエリの実行計画が含まれており、その後実行すると実行計画を通じてクエリを直接実行でき、SQL文を再解析する必要はありません。一方、ステートメントは毎回SQL文を再解析する必要があるため、追加のオーバーヘッドが発生します。
- パラメータバインディング:プレースホルダを用いて具体的なパラメータ値を置換するプリペアドステートメントに、パラメータバインディングで具体的なパラメータ値をセットすることができます。これによりSQLインジェクションを防げ、 aynı SQL文を何度も実行するときに、パラメータ値だけを置き換えれば済むため、SQL文を再コンパイルする必要がなく、実行効率が上がります。
- キャッシュ:データベースはあらかじめコンパイル済みの文や実行計画をキャッシュしているので、繰り返し再利用することでデータベースの解析や最適化にかかる時間を削減し、照会の執行効率を高めます。一方、文はキャッシュするメカニズムがありません。そのため、毎回の執行時に解析と最適化が必要となり、余分な負荷がかかります。
- ネットワーク転送: パラメータ化されたステートメントでは、SQL文とパラメータを別々にデータベースに送信できます。これにより、ネットワーク転送されるデータ量が減り、効率が向上します。一方、文では、完全なSQL文をデータベースに送信する必要があり、ネットワーク転送されるデータ量が増えてしまいます。
プリペアドステートメントを使用することで、同一SQL文の実行時に事前にコンパイルされた実行計画やキャッシュを再利用でき、データベース側の構文解析や最適化にかかる時間を短縮し、ネットワークで伝送されるデータ量を減らし、実行効率を高めます。