私たちのソフトウェアは、パフォーマンスの問題を抱えているクライアント サイトに展開されています。彼らは SQL コンサルタントを雇ってデータベースを調べ、ボトルネックがどこにあるかを確認しました。
コンサルタントが発見したことの 1 つは、多くのステートメントが に変換されていることでしたnvarchar
。いくつかの調査の後、PreparedStatement
それを行っていたのは であることがわかりました。
例を挙げると:
PreparedStatement query = connection.prepareStatement("SELECT * FROM sys.tables WHERE"
+ " name LIKE ?");
query.setString(1, "%%");
なる
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P0 nvarchar(4000)',N'SELECT * FROM sys.tables WHERE name LIKE @P0 ',N'%%'
select @p1
一方、アドホックの executeQuery メソッドは、SQL を送信するだけです。
ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM sys.tables WHERE name LIKE '%%'");
になる
SELECT * FROM sys.tables WHERE name LIKE '%%'
私が解決しようとしているのは、これが実際にどれほど悪いかということです。プリペアド ステートメントは、アドホック クエリよりも (複数回実行した場合) 効率的に使用できるため、アプリケーション全体で使用されます。
さらに、Microsoft の担当者が、パフォーマンスの問題を引き起こすことがわかっているものをドライバーに組み込むとは思えません。
これは本当に調査する必要があるものですか、それともコンサルタントは何もない問題を探していますか?