コードの分析およびテスト
データ型およびデータ型変換の正しい使用
文字項目の処理
ABAP SQL でのコードプッシュダウンの使用
内部テーブルのパフォーマンスの改善
権限チェックの実装
効果的なオブジェクト指向コードの設計
例外クラスの定義と処理
ABAP コードへの文書の追加

SQL トレースによるデータベースアクセスの分析

Objectives

After completing this lesson, you will be able to:
  • SQL トレースを開始します。
  • SQL トレース結果を分析します。

SQL トレース

SQL トレースは、ABAP システムとデータベース間のトラフィック全体を一元的に監視するために使用されます。ABAP 開発ツール内からトレースを有効化および無効化することができますが、トレース結果を分析するには、テクニカルモニタコックピット (ブラウザベースのアプリケーション) を起動する必要があります。

SQL トレースは、単一のユーザ、クライアント、またはサーバインスタンスに制限されません。複数のデータベースがシステムに接続されている場合は、これらすべてのデータベースのトラフィックがトレースされます。

トレース結果では、データベースの時間消費やアクセスレコード数など、個々の SQL 文に関する情報を照会することができます。Native SQL 構文、つまりデータベースに到達した形式の命令を分析することもできます。

SQL トレースの使用時には、いくつかの制限が適用されます。1 人のユーザのみが同時にトレースをオンに切り替えることができます。また、ABAP Development Tools からトレースを有効化しても、記録フィルタを追加する方法はありません。

SQL トレース結果

このビデオでは、SQL トレースを開始して結果を分析する方法を学習します。

SQL トレースツールの使用

ABAP コードをプロファイリングすることで、データベースへのアクセスが実行時間全体に大きく貢献していることがわかりました。次に、SQL トレースツールを使用して、プログラムのデータベースアクセスをより詳細に分析し、コードのパフォーマンスをさらに改善します。

テンプレート:

  • /LRN/CL_S4D401_ATS_PROFILING (グローバルクラス)

ソリューション:

  • /LRN/CL_S4D401_ATS_SQL_TRACE (グローバルクラス)

タスク 1: テンプレートのコピー (オプション)

テンプレートクラス /LRN/CL_S4D401_ATS_PROFILING をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。

ステップ

  1. クラス /LRN/CL_S4D401_ATS_PROFILING を各自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。

    1. Project Explorer で、クラス /LRN/CL_S4D401_ATS_PROFILING を右クリックしてコンテキストメニューを開きます。

    2. コンテキストメニューから Duplicate.... を選択します。

    3. Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。

    4. Next を選択します。

    5. 移送依頼を確認し、Finish を選択します。

  2. コピーを有効化します。

    1. Ctrl + F3 を押してクラスを有効化します。

タスク 2: SQL トレースの実行

パフォーマンスの問題をさらに分析するには、SQL トレースを有効化し、ABAP クラス ZCL_##_SOLUTION をコンソールアプリとして実行します。

同じ ABAP インスタンス内では、一度に 1 人のユーザのみが SQL トレースをオンに切り替えることができます。他のユーザに機会を付与するには、コンソールアプリケーションの実行が終了したら、SQL トレースをオフにします。

ステップ

  1. 開いていない場合は、エディタで ABAP クラス ZCL_##_SOLUTION を開きます。

    1. Ctrl + Shift + A を押して、ABAP クラスの名称を入力します。

    2. OK を選択します。

  2. ABAP クラウドプロジェクトの SQL トレースステータスダイアログを開きます。

    1. 左側の Project Explorer で、プロジェクトを右クリックしてコンテキストメニューを開きます。

    2. SQL トレース .... を選択します。

  3. 現在の SQL トレースステータスをチェックします。トレースがオンになっている場合は、ダイアログウィンドウを閉じて数分後に戻ります。

    1. OK を選択して、ダイアログウィンドウを閉じます。

  4. トレースが現在オフになっている場合は、オンに切り替えます。次に、ダイアログウィンドウを閉じます。

    1. 有効化を選択して、SQL トレースをオンに切り替えます。

    2. OK を選択して、ダイアログウィンドウを閉じます。

  5. グローバルクラス ZCL_##_SOLUTION をコンソールアプリとして実行します。

    1. F9 を押して、ABAP クラスをコンソールアプリとして実行します。

  6. アプリケーションが終了したらすぐに、SQL トレースをオフにして、トレースディレクトリを開きます。

    1. 右下隅の緑色の進捗インジケータが消えたら、Project Explorer でプロジェクトを右クリックし、SQL Trace .... を選択します。

    2. 無効化を選択して、SQL トレースをオフにします。

    3. トレースディレクトリを表示を選択して、トレースの一覧を表示します。

タスク 3: トレース結果の分析

SQL トレース結果を分析します。ABAP クラスから発生するデータベースアクセスをフィルタリングし、どのデータベーステーブルがどのくらいの頻度でアクセスされたかを調べます。

ステップ

  1. DB/OS コックピットで、最新のトレースのトレースレコードを照会します。

    ヒント

    デフォルトでは、トレースの一覧はタイムスタンプ列の降順でソートされます。
    1. 最上位の一覧エントリを選択します。

    2. トレースレコードを選択します。

  2. トレースレコードの一覧をフィルタリングします。ABAP クラス ZCL_##_SOLUTION からのレコードのみを表示します。

    ヒント

    プログラム列ヘッダを選択して設定できる表示フィルタではなく、Go ボタンの左側にあるフィルタオプションを使用することをお奨めします。

    1. テーブルのツールバーで、開始ボタンの左側にあるフィルタ (...) オプションを選択します。

    2. ダイアログウィンドウの上部にあるドロップダウンリストからプログラムを選択します。

    3. 類似オプションが選択されていることを確認します。

    4. Enter value というプロンプトを ABAP クラスの名称 (ZCL_##_SOLUTION) に置き換えます。

    5. OK を選択します。

    6. 開始を選択して、テーブルエントリを更新します。

  3. トレースレコードの一覧をソートします。最も多くのレコードにアクセスした SQL 文を検索します。

    注記

    デフォルトでは、トレースレコードの一覧はタイムスタンプ列でソートされます。ソートを変更するには、最初に既存のソートを削除する必要があります。
    1. Go ボタンの右側にある 3 つの水平ドットを選択します。

    2. ソートリセットを選択します。

    3. テーブルのツールバーで、開始ボタンの左側にあるソート (0) オプションを選択します。

    4. アクセス済レコード [#] 列を見つけます。左側のボックスにチェックを付け、この列に対して降順ソートボタンを選択します。

    5. OK を選択して、ダイアログウィンドウを閉じます。

    6. 実行を選択します。

  4. アクセス済レコード列によるソートを削除し、一覧を期間列の降順でソートします。

    1. Go ボタンの右側にある 3 つの水平ドットを選択します。

    2. ソートリセットを選択します。

    3. テーブルのツールバーで、開始ボタンの左側にあるソート (0) オプションを選択します。

    4. Duration [µs] 列を見つけます。左側のボックスにチェックを付け、この列に対して降順ソートボタンを選択します。

    5. OK を選択して、ダイアログウィンドウを閉じます。

    6. 実行を選択します。

  5. 最も負荷の高い単一レコード文については、SQL 文セクションにナビゲートします。

    1. アクセス済レコード列で値 1 の行を選択し、期間列で最大値を選択します。

    2. 上部のナビゲーションペインから SQL 文を選択します。

    3. FROM 句でテーブル名を検索します。

  6. ABAP 開発ツールで SELECT 文を開きます。

    1. ADT で ABAP ソース表示を選択します

タスク 4: コードの改善

コードのパフォーマンスをさらに改善するには、データベーステーブル /LRN/CONNECTION への繰り返される SELECT SINGLE アクセスを削除します。テーブル /LRN/CONNECTION には比較的少数のレコードが含まれています。そのため、データベーステーブルのコンテンツ全体を静的属性にバッファすることにしました (推奨名: connections_buffer)。静的コンストラクタ (メソッド class_constructor) でバッファに入力し、SELECT SINGLE 命令をバッファへの読込アクセスに置き換えます。

ヒント

データベーステーブル /LRN/CONNECTION への SELECT SINGLE アクセスは、ローカルクラス lcl_passenger_flightコンストラクタメソッドにあります。

ステップ

  1. 属性 connection_details の定義にナビゲートし、そこから構造データ型 st_connection_details の定義に移動します。

    1. SELECT SINGLE 命令の INTO 句で、connection_details にカーソルを置き、F3 を押します。または、Ctrl キーを押しながら connection_details をクリックすることもできます。

    2. DATA 命令で、st_connection_details にカーソルを置き、F3 を押します。または、Ctrl キーを押しながら st_connection_details をクリックすることもできます。

  2. 構造データ型 st_connection_details を新しいプライベート構造データ型にコピーします (推奨名: st_connections_buffer)。

    1. TYPES 命令全体 (行 END OF st_connection_details. を含む) を選択し、Ctrl + C を押します。

    2. private セクションまで下にスクロールし、ENDCLASS 命令の上にカーソルを置き、Ctrl + V を押してコピーしたコードを挿入します。

    3. 挿入されたコードで、st_connection_detailsst_connections_buffer に置き換えます。

  3. データベーステーブル /LRN/CONNECTION のキー項目 carrier_id および connection_idst_connections_buffer のコンポーネント一覧の先頭に追加します。

    1. コードを以下のように調整します。

      ABAP
      123456789
      TYPES: BEGIN OF st_connections_buffer, carrier_id TYPE /dmo/carrier_id, connection_id TYPE /dmo/connection_id, airport_from_id TYPE /dmo/airport_from_id, airport_to_id TYPE /dmo/airport_to_id, departure_time TYPE /dmo/flight_departure_time, arrival_time TYPE /dmo/flight_arrival_time, END OF st_connections_buffer.
  4. connections_buffer という名前のプライベート静的属性を、st_connections_buffer をローデータ型とする内部テーブルとして宣言します。

    1. クラス定義の最後に、以下のコードを追加します。

      ABAP
      1
      CLASS-DATA connections_buffer TYPE TABLE OF st_connections_buffer.
  5. クイックフィックスを使用して、クラス lcl_passenger_flight の静的コンストラクタ (クラスコンストラクタ) を生成します。

    1. 命令 CLASS lcl_passenger_flight DEFINITION まで上にスクロールします。

    2. lcl_passenger_flight にカーソルを置き、Ctrl + 1 を押して利用可能なクイックフィックスの一覧を表示します。

    3. 一覧から Generate class constructor を選択します。

  6. メソッド class_constructor の実装を編集します。データベーステーブル /LRN/CONNECTION から connections_buffer 属性にすべてのレコードを読み込む SELECT 文を実装します。

    1. コードを以下のように調整します。

      ABAP
      1234567
      METHOD class_constructor. SELECT FROM /lrn/connection FIELDS carrier_id, connection_id, airport_from_id, airport_to_id, departure_time, arrival_time INTO TABLE @connections_buffer. ENDMETHOD.
  7. メソッドコンストラクタの実装で、SELECT SINGLE 命令を connections_buffer への読込アクセスに置き換えます。

    注記

    属性 connection_details のコンポーネント数は、connections_buffer 属性の行データ型よりも少ないことに注意してください。
    1. SELECT SINGLE 命令全体を選択し、Ctrl + < を選択して各行の前にコメント記号を追加します。

    2. コメントされた SELECT SINGLE 命令の後に、以下のコードを追加します。

      ABAP
      12345678910111213
      * SELECT SINGLE * FROM /lrn/connection * FIELDS airport_from_id, airport_to_id, * departure_time, arrival_time * WHERE carrier_id = @carrier_id * AND connection_id = @connection_id * INTO @connection_details. connection_details = CORRESPONDING #( connections_buffer[ carrier_id = i_carrier_id connection_id = i_connection_id ] ).

タスク 5: コードを再チェックする

グローバルクラスを有効化してテストします。クラスをコンソールアプリとして実行します。プロファイリングを繰り返して、パフォーマンス改善を測定します。

ステップ

  1. グローバルクラスを有効化し、コンソールアプリとして実行します。

    1. Ctrl + F3 を押してクラスを有効化します。

    2. F9 を押して、クラスをコンソールアプリとして実行します。

  2. ABAP プロファイラで実行時測定を開始します。

    1. エディタを右クリックし、Profile AsABAP Application (Console) を選択します。

    2. トレースパラメータダイアログボックスで、設定を変更せずに終了を選択します。

  3. プロファイラパースペクティブに切り替え、トレース概要を分析します。

    1. WindowPerspectiveOpen PerspectiveOther... を選択します。ABAP Profiling を選択し、Open を選択します。

    2. ABAP トレースビューで、ABAP プロジェクトのコンテキストメニューからリフレッシュを選択します。または、ABAP トレースビューの任意の場所にカーソルを置き、F5 を押してトレース結果の一覧を再ロードすることもできます。

    3. 最新のトレースをダブルクリックします (これはプロジェクトの最上部にあるエントリです)。

    4. 全体の実行時間および ABAPデータベース間の配分が概要の下部セクションに表示されます。