TECHBLOGスキルブログ

SQLServer-JDBC実行計画の取得

2016.02.14

SQLServerでJDBCから実行されるSQLの本当の計画を取る方法。

Java、おそらく殆どはJDBCドライバ経由でSQLを実行していると思うのですが、その際パフォーマンスを見るために実行計画を取りたいと思ったことは多いはずです。
簡単なやり方としてはJDBCが出力するログなどからSQLを拾って実行する方法だと思います。
今回はそのようにログ出力のSQLをそのまま貼り付けて実行すると、実際にJDBC経由で実行したときと実行計画が変わることがあるという話です。
で、表題にもある「本当」のというのは、JDBCのPrepareStatementで実行した場合、実際はsp_executesqlプロシージャとして実行されるようなので、単純に実行されるSQLをダンプしてManagementStudioのクエリで実行しても、正確な実行計画が取得できない場合がある(あった)ということです。

そのまま実行した場合の例。

DECLARE @p_user_Id nvarchar(12);
DECLARE @p_user_nm nvarchar(12);
SET @p_user_Id = N’hoge’;
SET @p_user_nm = N’hoge%’;
SELECT * FROM SOME_TABLE WHERE USER_ID LIKE @p_user_Id AND USER_NM like @p_user_nm;

プロシージャをそのまま実行するのは不正確。
実行計画ウインドウ。普通に実行計画がとれます。
WS000001

JDBC(PrepareStatement)から実行した場合と同等にするなら。

DECLARE @p_user_Id nvarchar(12);
DECLARE @p_user_nm nvarchar(12);
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
SET @SQLString =
N’SELECT * FROM SOME_TABLE WHERE USER_ID = @user_Id AND USER_NM like @user_nm’;
SET @ParmDefinition = ‘@user_Id nvarchar(12),@user_nm varchar(200)’;
SET @p_user_Id = N’hoge’;
SET @p_user_nm = N’hoge%’;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@user_Id = @p_user_Id,@user_nm = @p_user_nm;

このプロシージャを実行するとjdbcと同じ動作機序で実行される。パラメータの設定が複雑になるのは致し方ない。

実行計画の取得

sp_executesqlはプロシージャなので、クエリウインドウの実行計画ボタンを押しても1行しか実行計画が出ない。

先ほどと同様にプロシージャ実行の実行計画をとった場合、プロシージャとしての実行計画がとれてしまう。
WS000004

なので実際に実行したSQLの実行計画を取るには動的Viewから取得する。

SELECT
creation_time,
last_execution_time,
execution_count,
query_plan,
text
FROM sys.dm_exec_query_stats
cross apply
sys.dm_exec_query_plan(plan_handle)
cross apply
sys.dm_exec_sql_text(sql_handle)
where text like ‘%SELECT * FROM SOME_TABLE%’
order by last_execution_time desc;
(場合によってはtextの検索条件に実行したSQLの断片をlike条件で絞った方が早く見つかる。)

実行するとSQLの履歴が取得できる。
WS000002

結果行のquery_plan列がリンクになっているので、クリックすると実行計画がみれる。

WS000003

つまりはsp_executesqlで実行しているか否か。

だいたいのフレームワーク(O/R Mapper)は基本的にPrepareStatementで実行されるので、同じ動作機序で実行するならsp_executesqlを使いましょう。


              

OTHER CONTENTSその他のコンテンツ

UNITRUST会社を知る

  • 私たちについて

  • 企業情報

SERVICE事業内容

  • システム開発

CONTACT
お問い合わせ

あなたの「想い」に挑戦します。

どうぞお気軽にお問い合わせください。

受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く

お問い合わせ