この節を終えると、次の機能を使用できるようになります。
- CUBE演算とROLLUP演算
- 逆パーセンタイル関数
- 仮説ランクと分布関数

「分析関数」と呼ばれるSQL機能は、バッチ処理からOLAPへのレポートまでのあらゆるデータ分析フォームをサポートします。
Oracle8i で導入された分析関数には、ランキング、移動/累積集計、リード、ラグ行オフセット、基本統計が含まれます。Oracle9 i 以前に導入された分析関数の詳細は、 こちらを参照してください。
Oracle9 i では分析関数にいくつかの新規ファミリが追加され、また連結グループ化、GROUPING
SETSなどGROUP BY句への拡張機能が追加されています。新規GROUP BY拡張機能には処理を一括する柔軟性が追加され、またマテリアライズド・ビューと統合され、さらなるパフォーマンスを提供します。
この節では、パフォーマンス拡張機能と関数によって提供されるよりシンプルな構文に焦点を当てて説明します。

| 5.4.3 Oracle Top Sessions利用のための英語設定の確認 |
|
本演習ではトライアル版のOracle Top Sessionsを利用しますが、完全に日本語対応されていませんので、通常の方法で起動すると日本語が正しく表示されません。まず、前節の 5.3.4「英語設定でのOracle Top Sessionsの利用」を参照して、英語表示に変更する操作を行ってください。前節に続けて本演習を行う場合、すでに英語表示に切り替わっているはずなので、この操作は必要ありません。

初めに、この節の演習で使用するサンプル・スクリプトの圧縮ファイルanalyze.zipをダウンロードし、解凍して実行できる状態にしておいてください。
次にOracle Top Sessions(Oracle Enterprise Managerに含まれています)を使用して、新しいOracle9i
の最適化機能で作成される実行計画を確認します。
|
1.
|
スタートボタンをクリックして、[プログラム]→[Oracle - OraHome90]→[Enterprise
Management Packs]→[Diagnostics]→[Top Sessions]メニューを選択します。
|
|
2.
|
[Database Logon]ウィンドウが表示されます。[Username]フィールドにsystem、[Password]フィールドにmanager、[Service]フィールドにorcl.worldと入力して、[OK]ボタンをクリックします(図5.4.1を参照)。
|

図5.4.1
画像をクリックすると拡大図をご覧いただけます
|
|
Oracle Top Sessionsが起動します(図5.4.2を参照)。実行計画のうちいくつか、特にクエリー・リライトを実行する場合は、Oracle Top Sessionsでは表示できません。これらを表示するには、データ・ウェアハウス・スキーマにPLAN_TABLE表を作成してExplain Plan文を使用します。
|

図5.4.2
画像をクリックすると拡大図をご覧いただけます
|

CUBE演算とROLLUP演算は、使いやすく非常に効率的な小計計算を提供します。これから行う演習では、ワシントン州とオレゴン州における会計年度の1月、2月の月別と製品カテゴリ別の売り上げを表示する問い合わせが実行されます。
CUBE演算とROLLUP演算を使用しない問い合わせ
最初に、CUBE/ROLLUP演算を「使用した」ほうがより迅速で簡単であることを確認するため、これらの演算を「使用しないで」問い合わせを実行します。
|
1.
|
データ・ウェアハウス・データベースに接続されているSQL*Plusで、@query_before_cube_rollup.sqlと入力して次のスクリプトを実行します(図5.4.3を参照)。
CONNECT sh/sh@orcl.world;
set timing on
SELECT t.fiscal_month_name month,
p.prod_category category,
SUM(s.amount_sold) total_sales
FROM sales s, products p, times t, customers c
WHERE s.time_id = t.time_id
AND s.prod_id = p.prod_id
AND s.cust_id = c.cust_id
AND t.fiscal_month_name in ('January ', 'February ')
AND c.cust_state_province in ('WA', 'OR')
GROUP BY t.fiscal_month_name, p.prod_category
UNION ALL
SELECT t.fiscal_month_name month,
NULL category,
SUM(s.amount_sold) total_sales
FROM sales s, products p, times t, customers c
WHERE s.time_id = t.time_id
AND s.prod_id = p.prod_id
AND s.cust_id = c.cust_id
AND t.fiscal_month_name in ('January ', 'February ')
AND c.cust_state_province in ('WA', 'OR')
GROUP BY t.fiscal_month_name
UNION ALL
SELECT NULL month,
NULL category,
SUM(s.amount_sold) total_sales
FROM sales s, products p, times t, customers c
WHERE s.time_id = t.time_id
AND s.prod_id = p.prod_id
AND s.cust_id = c.cust_id
AND t.fiscal_month_name in ('January ', 'February ')
AND c.cust_state_province in ('WA', 'OR');
|

図5.4.3
画像をクリックすると拡大図をご覧いただけます |
|
2.
|
問い合わせの実行中にOracle Top Sessionsに切り替えます。
|
|
3.
|
この問い合わせの実行計画を確認するため、アクティブな[SH]セッションをダブルクリックします(図5.4.4を参照)。
|

図5.4.4
画像をクリックすると拡大図をご覧いただけます
|
|
4.
|
[Session Details]ウィンドウが表示されます。[Session Details]タブの画面の、左下の[Current SQL]フィールド右にある[→]ボタンをクリックします。表示されるメニューから[Explain Plan]を選択します(図5.4.5を参照)。
|

図5.4.5
画像をクリックすると拡大図をご覧いただけます
|
|
5.
|
[Explain Plan]ウィンドウからこの問い合わせが、大量の入出力と中間結果の一時記憶域を要求するような、複数の表への走査、ハッシュ結合、ソートを実行していることが確認できます(図5.4.6を参照)。
|

図5.4.6
画像をクリックすると拡大図をご覧いただけます
|
|
6.
|
問い合わせが完了したら、経過時間を記録しておきます。
|
CUBE演算とROLLUP演算を使用する問い合わせ
今度はROLLUP演算子を使用して、同じ問い合わせを再実行します。
|
1.
|
データ・ウェアハウス・データベースに接続されたSQL*Plusセッションで、@query_with_cube_rollup.sqlと入力して次のスクリプトを実行します(図5.4.7を参照)。
CONNECT sh/sh@orcl.world;
set timing on
SELECT t.fiscal_month_name month,
p.prod_category category,
SUM(s.amount_sold) total_sales
FROM sales s, products p, times t, customers c
WHERE s.time_id = t.time_id
AND s.prod_id = p.prod_id
AND s.cust_id = c.cust_id
AND t.fiscal_month_name IN ('January ','February ')
AND c.cust_state_province in ('WA', 'OR')
GROUP BY ROLLUP (t.fiscal_month_name, p.prod_category);
|

図5.4.7
画像をクリックすると拡大図をご覧いただけます |
|
2.
|
同じ問い合わせの時間の差に注目してください。パフォーマンスが著しく改善されています。
|
|
3.
|
Oracle Top Sessionsを使用し、前述の「CUBE演算とROLLUP演算を使用しない問い合わせ」と同様に[Explain Plan]ウィンドウから、この問い合わせの実行計画を確認します(図5.4.8を参照)。
|

図5.4.8
画像をクリックすると拡大図をご覧いただけます
|
|
この問い合わせの実行に必要なSQLが大幅に簡素化されていることがわかります。単一の表への走査だけが実行されており、ハッシュ結合とソート操作数も劇的に減少しています。
|

| 5.4.6 マテリアライズド・ビュー使用時/非使用時の問い合わせの実行 |
|
Oracle9i の2つの新しい関数、PERCENTILE_CONTとPERCENTILE_DISCは、逆パーセンタイルの計算を行います。これらの関数には、ソートの指定と、0から1の間のパーセンタイル・パラメータ値が必要です。
これらの関数で、たとえば各製品カテゴリの平均価格など、指定されたパーセンタイル値に対応するデータを検索する問い合わせができます。以下はその問い合わせの例です。
|
データ・ウェアハウス・データベースに接続されたSQL*Plusセッションで、@percentile1.sqlと入力して次のスクリプトを実行します(図5.4.9を参照)。
SELECT prod_category, PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY prod_list_price) median_price
FROM products
GROUP BY prod_category;
|

図5.4.9
画像をクリックすると拡大図をご覧いただけます |
|
注意:問い合わせはWITHIN GROUP句を使用して、データの順位を指定します。
中央値(パーセンタイル=0.5)や上位3位(パーセンタイル=0.67)などの、変位値を検索します。
|
その他の例
たとえば、$200の製品の各カテゴリにおけるパーセンタイルを知りたいとき、問い合わせは以下のようになります。
|
データ・ウェアハウス・データベースに接続されたSQL*Plusセッションで、@percentile2.sqlと入力して次のスクリプトを実行します(図5.4.10を参照)。
SELECT prod_category,
CUME_DIST(200) WITHIN GROUP (ORDER BY prod_list_price DESC) Dollar_100_Percentile
FROM products
GROUP BY prod_category;
|

図5.4.10
画像をクリックすると拡大図をご覧いただけます
|
|
ソートされたデータ・セットのベースラインと分割点を設定します。
|

財務計画などの特定の分析では、データ値をデータ・セットに追加した場合にそのデータ値がどのように順位付けされるかを知りたい場合があります。たとえば、婦人服に新しい価格を導入し、会社内の他の価格に比べてその価格がどこにランクするかを知りたいとしましょう。
仮説ランクと分布関数では、このようなWhat-If分析をサポートします。これらの関数は、行が他の行セットに挿入されたと仮定した場合に割り当てられるランク、またはパーセンタイル値を返します。このような関数にはRANK、DENSE_RANK、PERCENT_RANK、CUME_DISTなどがあります。逆パーセンタイル関数と同じように、仮説ランクと分布関数はORDER
BY指定を含むWITHIN GROUP句を使用します。
以下はPRODUCTS表を使用する問い合わせです。価格$40の婦人服の価格に対する仮説ランクと分布が検索されます。
|
データ・ウェアハウス・データベースに接続されたSQL*Plusセッションで、@hypothetical_rank.sqlと入力して次のスクリプトを実行します(図5.4.11を参照)。
SELECT prod_subcategory, RANK(40) WITHIN GROUP(ORDER BY prod_list_price desc) as hypo_rank
FROM products
WHERE prod_subcategory LIKE '%Women%'
GROUP BY prod_subcategory;
|

図5.4.11
画像をクリックすると拡大図をご覧いただけます
|

| 5.4.8 ディメンション使用時/非使用時の問い合わせの実行 |
|
トライアル版のOracle Top Sessionsを使用するために行った英語設定を元に戻します。
- Windows 2000のスタートボタンをクリックして、[設定]→[コントロールパネル]→[地域のオプション]をクリックします。[地域のオプション]ダイアログの[ロケール(国または地域)]を[日本語]に戻し、[OK]ボタンをクリックします。
- 再びスタートボタンをクリックして、[ファイル名を指定して実行]メニューを選択し、REGEDT32と入力して[OK]ボタンをクリックします。
- レジストリエディタが起動します。以下に示すレジストリキーの値をダブルクリックし、[文字列]フィールドの値をJAPANESE_JAPAN.JA16SJIS(または記録しておいた元の値)に変更して[OK]ボタンをクリックします。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG
- レジストリエディタを終了します。
- OSを再起動します。
上記の操作により、正常な日本語環境に復元することができます。

この節では、次の方法を説明しました。
- CUBE演算とROLLUP演算
- 逆パーセンタイル関数
- 仮説ランクと分布関数

|