次は、Oracle Database JDBCドライバにのみ適用されます。他のドライバは異なる場合があります。
Connection.prepareStatement(String)を呼び出すと、データベースのラウンドトリップは行われません。新しいPreparedStatementを構築し、その中にSQL文字列を格納します。それはそれです。
未使用のPreparedStatementでも適度に複雑ですので、これはまったく簡単な呼び出しではありません。それでも、未使用のPreparedStatementのキャッシュにはあまり価値がありません。新しいものを構築するコストは低いです。 「未使用」を強調する。 PreparedStatementの最初の実行は完全な往復を行い、PreparedStatementの構築を完了します。 PreparedStatementを再利用すると、新しいPrepareStatementを作成して初めて使用するコストよりはるかに少なくなります。
2つのPreparedStatementsで同じSQLを実行すると、クライアントとサーバーの両方で1つのPreparedStatementを2回実行するよりもコストがかかります。クライアントの場合、追加費用はかなり簡単です。 2番目のPreparedStatementを完全に構築するコストです。これには、クライアントが最初に実行されたラウンドトリップの後に実行する作業が含まれます。物事はデータベースでそれほど単純ではありません。
Oracle Databaseには、複数のレベルのキャッシュと再利用があり、指定されたSQL文字列を複数回実行するコストを最小限に抑えます。 PreparedStatementはカーソルIDを保持します。そのIDはサーバー内のカーソルを参照します。カーソルは、SQL実行のデータベース表現である複雑な構造です。構造体の中には、同じSQLを実行する他のカーソルと共有することができます。構造の一部は、単一の実行に固有のものです。いくつかの構造体は、SQLを実行するカーソル間で共有できますが、他の構造体は共有できません。それは複雑なシステムです。
一般に、新しいPreparedStatementを作成するには、ハード解析が必要です。サーバがその前にSQLを見た場合、サーバはカーソル構造のいくつかを再利用できるので、ハード解析は完全なハード解析ではないかもしれません。アプリケーションがPreparedStatementを再実行する場合、理想的にはサーバーはカーソルに対して何もする必要はありません。それだけでそれを再実行します。しかし、サーバが再解析を実行する前にソフト解析を行わなければならない場合が多い。ソフト解析は、ハード解析よりも機能は少なくなりますが、自明ではありません。
上記は、暗黙的な文キャッシュを無視します。暗黙の文キャッシュは、Prepared文とCallable文を実行して作成された構造体を格納します。アプリケーションがSQLを実行し、PreparedStatementを閉じた後、同じSQLを持つ新しいPreparedStatementを作成し、最初の実行によって作成された構造が再利用されます。キャッシュ内にあったPreparedStatementの最初の実行のコストは、すべての実際的な目的のために、同じPreparedStatementを再実行するのと同じです。
この質問に対する回答はおそらくベンダー固有のものです。特定のJDBCドライバについて質問していますか?もしそうなら、どちらですか? –