日本語PDF

14 ワークロード・インテリジェンスの使用

ワークロード・インテリジェンスでは、取得したワークロードに格納されているデータを分析し、ワークロードの有意なパターンを特定します。この章では、次の内容で、ワークロード・インテリジェンスの使用方法を説明します。

ワークロード・インテリジェンスの概要

ワークロードを取得すると、取得したワークロードに関する情報を含む取得ファイルと呼ばれる多数のバイナリ・ファイルが生成されます。取得ファイルに保存されるこの情報を使用すると、取得したワークロードを後でリプレイする際に現実的に再生できます。取得済のワークロードに記録されているそれぞれのクライアント・リクエストから、SQLテキスト、バインド値、トランザクション情報、タイミング・データ、アクセスしたオブジェクトの識別子およびリクエストに関するその他の情報が取得されます。

ワークロード・インテリジェンスでは、取得ファイル内に保存されたこの情報を次などその他の用途に使用できます。

  • ワークロードの分析およびモデル化

  • ワークロードの有意なパターンおよび傾向の検出

  • ワークロードの取得時に本番システムで実行されていたものの視覚化

この項では、次の内容で、ワークロード・インテリジェンスについて説明します。

関連項目:

ワークロード・インテリジェンスについて

ワークロード・インテリジェンスとは、取得したワークロードに格納されているデータを分析するJavaプログラムのスイートです。これらのJavaプログラムは、ワークロードの取得時に記録されたデータに作用して、ワークロードを示すモデルを作成します。これらのモデルは、ワークロードの一部として実行されるテンプレートの有意なパターンを特定する助けとなります。

テンプレートとは、読取り専用のSQL文または1つ以上のSQL文で構成される全トランザクションです。2つのSQL文(またはトランザクション)が非常に類似している場合、同じテンプレートによって表されています。

ワークロード・インテリジェンスでは、テンプレートのパターンと対応するSQL文を調べ、取得したワークロードを視覚的に把握しやすくします。パターンの実行回数やそのパターンの実行で消費されたデータベース時間など重要な統計をパターンごとに確認できます。

ワークロード・インテリジェンスの使用事例

ワークロード・インテリジェンスを使用して、取得済ワークロードで有意なパターンを検出できます。

本番システムで実行されるSQL文は通常ユーザーが入力するものではなく、データベース・サーバーに接続されているアプリケーション・サーバーで実行されている1つ以上のアプリケーションから入力されます。アプリケーションには、通常このようなSQL文は有限数あります。特定の文のすべての実行で様々なバインド値が使用された場合でも、そのSQLテキストは基本的に同じです。

ユーザーのアプリケーションへの入力に応じ、データベースに対して、アプリケーション・コードで定義された特定の順序で発行される1つ以上のSQL文を含むコード・パスが実行されます。ユーザーが頻繁に行うアクションは、常に実行されるアプリケーションのコード・パスに対応します。このような頻繁に実行されるコード・パスによって、データベースによって特定の順序で実行されるSQL文のパターンが頻繁に生成されます。ワークロード・インテリジェンスは、取得済ワークロードを分析して、このようなパターンを検出し、関連する実行統計と関連付けます。つまり、ワークロード・インテリジェンスでは、取得ファイルに保存されているこの情報を使用し、ワークロードの取得時に本番システムで実行されていたアプリケーションの有意なコード・パスによって生成されるパターンを検出します。ワークロード・インテリジェンスは、これをアプリケーションの情報をまったく使用せず行います。

ワークロード・インテリジェンスを使用し、有意なパターンを検出することにより、次が可能となります。

  • ワークロードの取得時、データベースで実行されていたものを視覚化しやすくなります。

  • 最適化に使用できる情報をさらに得ることができます。

  • SQL文は分離されず、まとめられているので、コンテキストが把握しやすくなります。

ワークロード・インテリジェンスの使用要件

ワークロード・インテリジェンスは取得ファイルに保存された情報を使用するもので、ワークロード・リプレイを使用したワークロードの実行は必要としません。また、ワークロード・インテリジェンスでは、ユーザー・スキーマ、ユーザー・データまたは本番システムへの接続を必要としません。ワークロード・インテリジェンスの実行は大量のリソースを消費する可能性があるため、本番システムでオーバーヘッドを回避するには、特に取得済ワークロードが大きい場合、テスト・システムに取得ファイルをコピーして、ワークロード・インテリジェンスを使用することをお薦めします。

ワークロード・インテリジェンスを構成するJavaプログラムを起動するために必要なJavaクラスは、$ORACLE_HOME/rdbms/jlib/dbrintelligence.jarに含まれています。クラスパスには、$ORACLE_HOME/rdbms/jlib/dbrparser.jar$ORACLE_HOME/jdbc/lib/ojdbc6.jarの2つのjarファイルも含まれている必要があります。

ワークロード・インテリジェンスでは、内部でいくつかのSYS表とビューも使用します。

ワークロード・インテリジェンスを使用した取得済ワークロードの分析

この項では、ワークロード・インテリジェンスを使用した取得済ワークロードの分析のためのステップについて説明します。たとえば:

ワークロード・インテリジェンスを使用し、取得済ワークロードを分析するには:

  1. 「ワークロード・インテリジェンスのデータベース・ユーザーの作成」で説明されているように、ワークロード・インテリジェンスを使用する適切な権限を持つデータベース・ユーザーを作成します。

  2. 「ワークロード・インテリジェンスのジョブの作成」で説明されているように、LoadInfo Javaプログラムを実行し、新しいワークロード・インテリジェンス・ジョブを作成します。

  3. 「ワークロード・モデルの生成」で説明されているように、BuildModel Javaプログラムを実行し、ワークロードのモデルを生成します。

  4. 「ワークロード内のパターンの識別」で説明されているように、FindPatterns Javaプログラムを実行し、ワークロードで発生するパターンをテンプレートから識別します。

  5. 「ワークロード・インテリジェンス・レポートの生成」で説明されているように、GenerateReport Javaプログラムを実行し、結果を表示するレポートを生成します。

ワークロード・インテリジェンスのデータベース・ユーザーの作成

ワークロード・インテリジェンスの使用を開始する前に、適切な権限を持つデータベース・ユーザーを作成する必要があります。

例14-1に、ワークロード・インテリジェンスを使用可能なデータベース・ユーザーを作成する方法を示します。

例14-1 ワークロード・インテリジェンスのデータベース・ユーザーの作成

create user workintusr identified by password;
grant create session to workintusr;
grant select,insert,alter on WI$_JOB to workintusr;
grant insert,alter on WI$_TEMPLATE to workintusr;
grant insert,alter on WI$_STATEMENT to workintusr;
grant insert,alter on WI$_OBJECT to workintusr;
grant insert,alter on WI$_CAPTURE_FILE to workintusr;
grant select,insert,alter on WI$_EXECUTION_ORDER to workintusr;
grant select,insert,update,delete,alter on WI$_FREQUENT_PATTERN to workintusr;
grant select,insert,delete,alter on WI$_FREQUENT_PATTERN_ITEM to workintusr;
grant select,insert,delete,alter on WI$_FREQUENT_PATTERN_METADATA to workintusr;
grant select on WI$_JOB_ID to workintusr;
grant execute on DBMS_WORKLOAD_REPLAY to workintusr;

ワークロード・インテリジェンスのジョブの作成

ワークロード・インテリジェンスのジョブを作成するには、LoadInfoプログラムを使用します。LoadInfoは、ワークロード・インテリジェンスのアルゴリズムを適用する新しいタスクを作成するJavaプログラムです。このプログラムは、取得ディレクトリにあるプログラムを解析し、ワークロード・インテリジェンスの実行に必要な関連情報を内部表に格納します。

LoadInfoプログラムでは、次の構文を使用します。

java oracle.dbreplay.workload.intelligence.LoadInfo -cstr connection_string -user username -job job_name -cdir capture_directory

java oracle.dbreplay.workload.intelligence.LoadInfo -version

java oracle.dbreplay.workload.intelligence.LoadInfo -usage

LoadInfoプログラムでは、次のオプションをサポートします。

  • -cstr

    ワークロード・インテリジェンスが実行に必要な情報と中間結果を格納するデータベースへのJDBC接続文字列を指定します(たとえば、jdbc:oracle:thin@hostname:portnum:ORACLE_SID)。

  • -user

    データベース・ユーザー名を指定します。ユーザーには、ワークロード・インテリジェンスを使用する特定の権限が必要です。

    適切な権限を持つデータベース・ユーザーの作成方法の詳細は、「ワークロード・インテリジェンスのデータベース・ユーザーの作成」を参照してください。

  • -job

    ワークロード・インテリジェンスのジョブを一意に識別する名前を指定します。

  • -cdir

    ワークロード・インテリジェンスで分析する取得ディレクトリのオペレーティング・システム・パスを指定します。

  • -version

    LoadInfoプログラムのバージョン情報を示します。

  • -usage

    LoadInfoプログラムのコマンドライン・オプション情報を示します。

例14-2に、LoadInfoプログラムを使用し、wijobsalesというワークロード・インテリジェンスのジョブを作成する方法を示します。

例14-2 ワークロード・インテリジェンスのジョブの作成

java -classpath $ORACLE_HOME/rdbms/jlib/dbrintelligence.jar:
$ORACLE_HOME/rdbms/jlib/dbrparser.jar:
$ORACLE_HOME/jdbc/lib/ojdbc6.jar:
oracle.dbreplay.workload.intelligence.LoadInfo -job wijobsales -cdir
/test/captures/sales -cstr jdbc:oracle:thin:@myhost:1521:orcl -user workintusr

ワークロード・モデルの生成

ワークロード・モデルを生成するには、BuildModelプログラムを使用します。BuildModelは、取得済ワークロード(このデータは、LoadInfoプログラムで生成される必要があります)からデータを読み取り、ワークロードを表すモデルを生成するJavaプログラムです。このモデルは、ワークロードで発生した頻繁に出現するテンプレート・パターンを識別するために使用できます。

BuildModelプログラムでは、次の構文を使用します。

java oracle.dbreplay.workload.intelligence.BuildModel -cstr connection_string -user username -job job_name

java oracle.dbreplay.workload.intelligence.BuildModel -version

java oracle.dbreplay.workload.intelligence.BuildModel -usage

BuildModelプログラムでは、次のオプションをサポートします。

  • -cstr

    ワークロード・インテリジェンスが実行に必要な情報と中間結果を格納するデータベースへのJDBC接続文字列を指定します(たとえば、jdbc:oracle:thin@hostname:portnum:ORACLE_SID)。

  • -user

    データベース・ユーザー名を指定します。ユーザーには、ワークロード・インテリジェンスを使用する特定の権限が必要です。

    適切な権限を持つデータベース・ユーザーの作成方法の詳細は、「ワークロード・インテリジェンスのデータベース・ユーザーの作成」を参照してください。

  • -job

    ワークロード・インテリジェンスのジョブを一意に識別する名前を指定します。

  • -version

    BuildModelプログラムのバージョン情報を示します。

  • -usage

    BuildModelプログラムのコマンドライン・オプション情報を示します。

例14-3に、BuildModelプログラムを使用し、ワークロード・モデルを生成する方法を示します。

例14-3 ワークロード・モデルの生成

java -classpath $ORACLE_HOME/rdbms/jlib/dbrintelligence.jar:
$ORACLE_HOME/rdbms/jlib/dbrparser.jar:
$ORACLE_HOME/jdbc/lib/ojdbc6.jar:
oracle.dbreplay.workload.intelligence.BuildModel -job wijobsales -cstr
jdbc:oracle:thin:@myhost:1521:orcl -user workintusr

ワークロード内のパターンの識別

ワークロード内のパターンを識別するには、FindPatternsプログラムを使用します。FindPatternsは、取得済ワークロード(このデータは、LoadInfoプログラムで生成される必要があります)およびこれに対応するワークロード・モデル(このワークロード・モデルは、BuildModelプログラムで生成される必要があります)からデータを読み取り、ワークロードで発生した頻繁に出現するテンプレート・パターンを識別するJavaプログラムです。

FindPatternsプログラムでは、次の構文を使用します。

java oracle.dbreplay.workload.intelligence.FindPatterns -cstr connection_string 
-user username -job job_name -t threshold

java oracle.dbreplay.workload.intelligence.FindPatterns -version

java oracle.dbreplay.workload.intelligence.FindPatterns -usage

FindPatternsプログラムでは、次のオプションをサポートします。

  • -cstr

    ワークロード・インテリジェンスが実行に必要な情報と中間結果を格納するデータベースへのJDBC接続文字列を指定します(たとえば、jdbc:oracle:thin@hostname:portnum:ORACLE_SID)。

  • -user

    データベース・ユーザー名を指定します。ユーザーには、ワークロード・インテリジェンスを使用する特定の権限が必要です。

    適切な権限を持つデータベース・ユーザーの作成方法の詳細は、「ワークロード・インテリジェンスのデータベース・ユーザーの作成」を参照してください。

  • -job

    ワークロード・インテリジェンスのジョブを一意に識別する名前を指定します。

  • -t

    あるテンプレートから次のテンプレートへの移行が同じパターン内であるか、2つのパターンの境界にあるかを定義する際のしきい値とする確率を指定します。有効な値は、[0.0, 1.0]の範囲の実数です。これは任意指定の値ですが、デフォルト値は0.5です。

  • -version

    FindPatternsプログラムのバージョン情報を示します。

  • -usage

    FindPatternsプログラムのコマンドライン・オプション情報を示します。

例14-4に、FindPatternsプログラムを使用し、ワークロード内のよく出現するパターンを識別する方法を示します。

例14-4 ワークロード内のパターンの識別

java -classpath $ORACLE_HOME/rdbms/jlib/dbrintelligence.jar:
$ORACLE_HOME/rdbms/jlib/dbrparser.jar:
$ORACLE_HOME/jdbc/lib/ojdbc6.jar:
oracle.dbreplay.workload.intelligence.FindPatterns -job wijobsales -cstr
jdbc:oracle:thin:@myhost:1521:orcl -user workintusr -t 0.2

ワークロード・インテリジェンス・レポートの生成

ワークロード・インテリジェンスのレポートを生成するには、GenerateReportプログラムを使用します。GenerateReportは、ワークロード・インテリジェンスの結果を示すレポートを生成するJavaプログラムです。ワークロード・インテリジェンスのレポートは、ワークロード内のパターンを示すHTMLページです。

GenerateReportプログラムでは、次の構文を使用します。

java oracle.dbreplay.workload.intelligence.GenerateReport -cstr connection_string 
-user username -job job_name -top top_patterns -out filename

java oracle.dbreplay.workload.intelligence.GenerateReport -version

java oracle.dbreplay.workload.intelligence.GenerateReport -usage

GenerateReportプログラムでは、次のオプションをサポートします。

  • -cstr

    ワークロード・インテリジェンスが実行に必要な情報と中間結果を格納するデータベースへのJDBC接続文字列を指定します(たとえば、jdbc:oracle:thin@hostname:portnum:ORACLE_SID)。

  • -user

    データベース・ユーザー名を指定します。ユーザーには、ワークロード・インテリジェンスを使用する特定の権限が必要です。

    適切な権限を持つデータベース・ユーザーの作成方法の詳細は、「ワークロード・インテリジェンスのデータベース・ユーザーの作成」を参照してください。

  • -job

    ワークロード・インテリジェンスのジョブを一意に識別する名前を指定します。

  • -top

    レポートに示すパターン数を示す数値を指定します。パターンは、様々な基準で(実行回数、データベース時間および長さ)でソートされており、定義した上位の結果数のみが表示されます。これは任意指定の値ですが、デフォルト値は10です。

  • -out

    レポートが格納されるファイルの名前(HTML形式)を指定します。この値の指定は任意ですが、デフォルト値には、-jobオプションで指定したジョブ名が使用されます。

  • -version

    GenerateReportプログラムのバージョン情報を示します。

  • -usage

    GenerateReportプログラムのコマンドライン・オプション情報を示します。

例14-5に、GenerateReportプログラムを使用し、ワークロード・インテリジェンスのレポートを生成する方法を示します。

例14-5 ワークロード・インテリジェンス・レポートの生成

java -classpath $ORACLE_HOME/rdbms/jlib/dbrintelligence.jar:
$ORACLE_HOME/rdbms/jlib/dbrparser.jar:
$ORACLE_HOME/jdbc/lib/ojdbc6.jar:
oracle.dbreplay.workload.intelligence.GenerateReport -job wijobsales -cstr
jdbc:oracle:thin:@myhost:1521:orcl -user workintusr -top 5 -out wijobsales.html

例: ワークロード・インテリジェンスの結果

この項では、ワークロード・インテリジェンスがSwingbench(Oracle Databaseのストレス・テストに使用されるベンチマーク)で生成された取得ワークロードに対して使用されているシナリオを想定しています。

ワークロード・インテリジェンスで検出された最も有意なパターンは、次の6つのテンプレートのものです。

SELECT product_id, product_name, product_description, category_id, weight_class,
       supplier_id, product_status, list_price, min_price, catalog_url
  FROM product_information
 WHERE product_id = :1;
SELECT p.product_id, product_name, product_description, category_id, weight_class,
       supplier_id, product_status, list_price, min_price, catalog_url,
       quantity_on_hand, warehouse_id
  FROM product_information p, inventories i
 WHERE i.product_id = :1 and i.product_id = p.product_id;
INSERT INTO order_items (order_id, line_item_id, product_id, unit_price, quantity)
     VALUES (:1, :2, :3, :4, :5);
UPDATE orders
   SET order_mode = :1, order_status = :2, order_total = :3
 WHERE order_id = :4;
SELECT /*+ use_nl */ o.order_id, line_item_id, product_id, unit_price, quantity,
       order_mode, order_status, order_total, sales_rep_id, promotion_id,
       c.customer_id, cust_first_name, cust_last_name, credit_limit, cust_email
  FROM orders o, order_items oi, customers c
 WHERE o.order_id = oi.order_id
   AND o.customer_id = c.customer_id
   AND o.order_id = :1;
UPDATE inventories
   SET quantity_on_hand = quantity_on_hand - :1
 WHERE product_id = :2
   AND warehouse_id = :3;

このパターンは、製品の注文でよく行われるユーザー・アクションに対応します。この例で特定されたパターンは222,261回(または実行の合計数の約8.21%)実行され、DB時間は58,533.70秒(または合計DB時間の約11.21%)消費されました。

この例で、ワークロード・インテリジェンスでは、次の4つのテンプレートの別の有意なパターンも検出しています。

SELECT customer_seq.nextval
  FROM dual;
INSERT INTO customers (customer_id, cust_first_name, cust_last_name, nls_language,
                       nls_territory, credit_limit, cust_email, account_mgr_id)
     VALUES (:1, :2, :3, :4, :5, :6, :7, :8);
INSERT INTO logon
     VALUES (:1, :2);
SELECT customer_id, cust_first_name, cust_last_name, nls_language, nls_territory,
       credit_limit, cust_email, account_mgr_id
  FROM customers
 WHERE customer_id = :1;

このパターンは、新しい顧客アカウントの作成とその後のシステムへのログインに対応します。この例で特定されたパターンは90,699回(または実行の合計数の約3.35%)実行され、DB時間は17,484.97秒(または合計DB時間の約3.35%)消費されました。