この記事を読むメリット
- SQLトレースに関する知識が体系的に理解できます
- ST05を使ったSQLトレースの実行方法が習得できます
T-CODE:ST05は、SQL・ロック・RFC などのトレース機能を持ちますが、その中でよく使われるのがSQLトレースです。SQLトレースは、ABAPプログラムがデータベースへ送ったSQL(検索や更新の命令)を、そのまま記録して見比べられる機能です。画面が遅い、ジョブが重いといった性能調査に強いのはもちろんですが、「このトランザクションはどのテーブルを読んでいるのか/更新しているのか」を確認したいときにも、とても有効です。
プログラムで実行されているSQLが確認できるんですね!
その通りじゃ。
どんなデータを抽出してきているのか・レスポンスが悪いのはなぜかを調査する時に使えるぞい!
本記事では、SQLトレースに関する概要をおさえつつ、ST05を使った実行方法を実務視点で整理していますので、ぜひご参考ください!
この記事のポイント
概要
SQLトレースとは、ABAPプログラムやトランザクションが実際にデータベースへ投げたSQL命令を、その発行順・内容・所要時間とともに記録する仕組みです。SQLトレースはDBを操作する最終形のSQLを残し、かつどれだけ時間がかかり、何行読み書きし、どのテーブルやインデックスに触れたかまで可視化します。つまり、画面やジョブの“遅さ/重さ”をDB視点で説明できる材料になります。
ST05では、次の観点でトレースを採取・分析できます。
ST05の特徴
- 対象の絞り込み:ユーザ単位でトレースをオンにし、必要な操作だけ短時間採取できます。
- SQL明細の確認:最終SQL本文、実行時間(Duration)、取得・スキャン行数(Rows)、アクセス先(Table)、操作種別(SELECT/INSERT/UPDATE/DELETE)、アクセス種別(インデックスアクセスかテーブルスキャンか、バッファ経由か など)などが見られます。
- フィルタリング:更新系だけ、特定テーブルだけ、といった条件絞り込みでノイズを削れます。
- 深掘りへの連携:長時間の傾向はSQLM、ABAP側の処理時間はST12/SATと組み合わせて、アプリ側かDB側かの切り分けを進められます。
SQLトレースの実行方法
SQLトレースの大まかな手順は以下の通りです。
SQLトレースの手順
- トレース対象の処理画面を準備する
- ST05を開き、トレース開始ボタンを押下する
- トレース対象の処理を実行する
- ST05の画面で、トレース終了ボタンを押下する
- トレース内容の照会ボタンを押下する
それでは、実際の画面イメージを使って説明していくぞい
実機でのSQLトレース方法の解説
まずは、調査したい対象の処理を別ウィンドウで準備します。
今回は、デモ用で用意したABAPプログラム「ZTEST_OKD02」をT-CODE:SE38の実行画面で用意しています。
このプログラムは、選択画面で会社コードや会計期間等を選択し、その条件に応じた会計伝票明細をテーブルから抽出するという簡単なテストプログラムです。
次に、T-CODE:ST05を新しいウィンドウで開き、「SQLトレース」にチェックをつけた状態(下図の①)で「トレース開始」ボタンを押下(下図の②)します。現在ログオン中のアプリケーションサーバ上で、対象ユーザが発行するSQLがトレース対象になります。
事前に開いておいた調査したい対象の画面に戻り、実行ボタンを押下します。(下図の③)
ST05-SQLトレース手順1
プログラムの処理が完了した後、ST05の画面に戻り「トレース終了」ボタンを押下(下図の④)し、続けて「トレース照会」画面を押下(下図の⑤)します。これにより、SQLトレースの記録が終了し、トレース照会の選択画面に遷移します。
ST05-SQLトレース手順2
トレース結果の照会と分析
選択画面では、直近でトレースした開始日時と終了日時や実行ユーザIDがデフォルトで入ってきます。
問題なければそのまま実行ボタンを押下します。
ST05-SQLトレース手順3
出力された結果はALV形式でフィルターや並び替えができますが、Excelなどのローカルファイルに出力することもできます。
主な表示項目
- 開始時間
- 実行時間:「Duration」列を見れば、どのSQLが遅いか一目で分かる
- CPU使用時間
- メモリ消費量
- レコード数:「Records」列で、無駄に大量データを読んでいないか確認できる
- プログラム名
- オブジェクト名:テーブル名だけでなく、ビューや一部のシステムオブジェクトも含まれる
- ステートメント:SQLの実行文を確認できる
ST05-SQLトレース手順4
レコードをダブルクリックすると、詳細画面に遷移します。上記画像の様に、SQL文の場合はSQL文の詳細とパラメータ値が表示されます。また、レコードを選択した状態で「ABAP Call Location」のアイコンを押下すると、対象のABAPコードに遷移することができます。
今回の例では、何回も同じSELECT文が呼び出されていることがわかると思います。
これは、ABAPのループの中で毎回SELECTを発行する実装方法をとっているために起こる典型的な例です。本来は、結合(JOIN)や “FOR ALL ENTRIES” を使って、一度のSQLでまとめて取得することで、同じSQLを何十回・何百回とDBに投げる「多重実行」を避けることができます。
あわせて読みたい
【SAP ABAP】基本構文:データベーステーブル操作(SELECT、INSERT、UPDATE、DELETE)
この記事を読むメリット SELECT命令、INSERT命令、UPDATE命令、DELETE命令を使用して、データベーステーブル操作を行えるようになります。 今回はABAPのデータベース操…
ST05-SQLトレース_例1
もっと詳しく💡
次のSQLトレース結果では、SELECT文が1回だけ実行されていますが、「実行時間(Duration)」や「レコード数(Record)」などから処理が比較的重くなっていることがわかります(HANAの性能上この程度では問題ありませんが)。
SQLの詳細を見てみると、WHERE文でまったく絞り込みをかけずに会計伝票明細(BSEG)をSELECTしていることがわかります。このような条件不足によるテーブルのフルスキャンは、もちろん障害の原因になりますので、注意が必要です。
特に、会社コード(BUKRS)や年度(GJAHR)、転記日付(BUDAT)といった、インデックスが張られている項目で絞り込むことが重要です。
SAP ST05-SQLトレース_例2
注意点
T-CODE:ST05のSQLトレースは、あくまでDBに投げられたSQLを記録するものであり、LOOP・SORT・集計などのABAP側の処理は記録することができません。
つまり、「大量データをABAPに持ってきてゴリゴリ処理している」ようなポイントは、ST05単体では直接検知できないというわけです。
そのため、T-CODE:SATやT-CODE:ST12でABAPランタイムを測り、どのサブルーチン/命令が時間を消費しているかを確認するなど、複合的な調査が必要になります。ST12であれば、ABAPトレースとSQLトレースをまとめて取得できるため、ABAP側とDB側のどちらがボトルネックなのかを切り分けやすくなります。
まとめ
T-CODE:ST05は、パフォーマンス調査だけでなく、「この処理はどのテーブルにアクセスしているのか」を確認するための便利なツールでもあります。使い方はシンプルで、「対象をしぼって短くトレース→結果を並べ替えて重い処理や関係するテーブルを特定」という流れを守れば、誰でも十分活用できます。
本記事が、日々の業務に役立てていただければ幸いです。最後まで読んでいただきありがとうございました!
SAP運用保守でよく使うトランザクションコードを以下の記事にまとめた記事が参考になるぞい!
あわせて読みたい
【SAP運用保守で使える!】システム不具合調査で役立つトランザクションコードまとめ
この記事を読むメリット SAPシステムの不具合調査で使える主要なトランザクションコードを知ることができます。 エラーの種類別に効率的な調査手順を習得できます。 シ…