14 ワークロード・インテリジェンスの使用
ワークロード・インテリジェンスの概要
ワークロード・インテリジェンスでは、取得ファイル内に保存されたこの情報を次などその他の用途に使用できます。
-
ワークロードの分析およびモデル化
-
ワークロードの有意なパターンおよび傾向の検出
-
ワークロードの取得時に本番システムで実行されていたものの視覚化
この項では、次の内容で、ワークロード・インテリジェンスについて説明します。
関連項目:
-
ワークロードの取得の詳細は、「ワークロードの取得」を参照してください
-
ワークロードのリプレイの詳細は、「ワークロードのリプレイ」を参照してください
ワークロード・インテリジェンスについて
テンプレートとは、読取り専用の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
表とビューも使用します。
ワークロード・インテリジェンスを使用した取得済ワークロードの分析
ワークロード・インテリジェンスを使用し、取得済ワークロードを分析するには:
-
「ワークロード・インテリジェンスのデータベース・ユーザーの作成」で説明されているように、ワークロード・インテリジェンスを使用する適切な権限を持つデータベース・ユーザーを作成します。
-
「ワークロード・インテリジェンスのジョブの作成」で説明されているように、
LoadInfo
Javaプログラムを実行し、新しいワークロード・インテリジェンス・ジョブを作成します。 -
「ワークロード・モデルの生成」で説明されているように、
BuildModel
Javaプログラムを実行し、ワークロードのモデルを生成します。 -
「ワークロード内のパターンの識別」で説明されているように、
FindPatterns
Javaプログラムを実行し、ワークロードで発生するパターンをテンプレートから識別します。 -
「ワークロード・インテリジェンス・レポートの生成」で説明されているように、
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プログラムです。このプログラムは、取得ディレクトリにあるプログラムを解析し、ワークロード・インテリジェンスの実行に必要な関連情報を内部表に格納します。
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
-
-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プログラムです。このモデルは、ワークロードで発生した頻繁に出現するテンプレート・パターンを識別するために使用できます。
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
-
-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
-
-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
-
-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%)消費されました。