連載
» 2007年03月05日 00時00分 公開

Oracleパーティショニング実践講座(4):パラレル処理の有効性と落とし穴を検証する (1/4)

本連載では、大規模データベースでのパフォーマンス・チューニングの手法として、Oracleパーティショニングを解説する。単なる機能説明にとどまらず、実機による検証結果を加えて、より実践的な内容をお届けする。(編集部)

[岸和田隆,アシスト]

 前回「パーティショニングとパラレル処理は最高の相性」で説明したように、パーティショニングとパラレル処理を併用することで、パフォーマンス向上に相乗効果が望めます。ただ、パラレル処理はハードウェア・リソース(CPU、メモリ、ディスクI/O)を活用するよう設計されているため、ハードウェア・リソースの空きが十分でないとパラレル処理の利点はなく、かえってパフォーマンス劣化につながる可能性があるともいわれています。

 今回は、パラレル処理がどの程度の効果をもたらすのか、ハードウェア・リソースの空きが十分でない場合にどのような結果となるのか、などをご紹介します。

確認するパラレル処理と検証環境

 筆者が勤務する株式会社アシストでは、パラレル処理の有効性を確認するために、大規模なデータの検索、挿入やオブジェクトの作成など、以下の3つのケースに分けて検証しました。

  • パラレルクエリ
    表のスキャン、結合・集合・各種ソート操作など
  • パラレルDDL
    副問い合わせを含む表の作成、索引の作成など
  • パラレルロード
    従来型ロードの分割、1オブジェクトへの同時ロードなど

 検証環境には、図1のように「Oracle Real Application Clusters 10g」(以下、Oracle RAC)を利用しました。データベース・サーバのクラスタであるOracle RACは、1つのデータベースへの処理を複数のノードで管理でき、可用性、拡張性、負荷分散に優れた構成を実現できます。

 データベース・サーバには1ノード当たりXeonプロセッサを2つ搭載して、ハイパースレッディング機能によりOS側からは4つのCPUが存在しているように見える状態としました。また、ストレージには「DELL|EMC CX300」を使用し、15本のディスクをRAID0として構成しました(表1)。

図1 検証環境のシステム構成 図1 検証環境のシステム構成
表1 検証環境のスペック 表1 検証環境のスペック

パラレル・クエリの検証条件

 第2回「パーティション・プルーニングの有効性を検証する」のときと同様に検証用のSQLとして、筆者の勤務するアシストが提供する「Rapid Warehouse Pack」のERモデルと、Webレポーティング・ツール「WebFOCUS」のテンプレートから、単純なSQLを抽出しています。詳細は第2回の「図4 検証で使用する表構成(Rapid Warehouse Pack ERモデル)」「表2 売上実績表の組み合わせとパーティション数」を参照してください。

 パラレル・クエリの検証で使用する売上実績表は更新日列をレンジ・キーとして月単位でパーティション化、さらに商品番号列をハッシュ・キーとして8つのサブパーティションに分割したコンポジット・レンジ−ハッシュ・パーティションです。リスト1のように、上記の売上実績表に対して、ある年の全商品の売上実績を集計するSQLを、並列度:2、4、8、16、32と変化させて応答時間を計測しました。

 また、パラレル・クエリの検証ではOracle RACを使用しているため、インターノード・パラレル・クエリの効果も確認しています。インターノード・パラレル・クエリとは、1つのSQLの処理を複数ノードに分散して実施できる機能です。単一のノードでパラレル処理を実施する場合に比べ、より多くのCPUリソースを効果的に利用できるといわれています。

SELECT
/*+ full(T2) parallel(T2,4)
    full(T1) parallel(T1,4) */  /* 売上実績がコンポジット・パーティション
                                   の場合* /
/*  full(T2) parallel(T2,4) */  /* 売上実績がレンジ・パーティション
                                   の場合* /
   T2."納品年",
   T2."納品月",
   T1."商品番号",
   T1."商品名",
   T4."商品分類分類2名称",
   SUM((T2."税抜売上単価" * T2."納品数量")),
   SUM(((T2."税抜売上単価" - T2."税抜販売単価") * T2."納品数量")),
   SUM(((T2."税抜販売単価" - T1."税抜売上原価") * T2."納品数量")),
   SUM((T1."税抜仕入単価" * T2."納品数量")),
   SUM(((T2."税抜販売単価" - T1."税抜仕入単価") * T2."納品数量")),
   SUM(((T2."税抜販売単価" - T1."税抜標準原価") * T2."納品数量")),
   SUM(T2."納品数量")
FROM
   "商品分類2" T4,
   "取引区分" T3,
   "売上実績" T2,
   "商品" T1
WHERE
   (T2."商品番号" = T1."商品番号")
   AND T2.取引区分番号 = T3.取引区分番号
   AND T1.商品分類2番号 = T4.商品分類2番号
   AND (T2."更新日") >= TO_DATE(20020101,'YYYYMMDD') 
   AND (T2."更新日") < TO_DATE(20030101,'YYYYMMDD')

   AND T3.取引区分名 in ('現金売上','現金仕入')
GROUP BY
   T2."納品年",T2."納品月",T1."商品番号",T1."商品名",T4."商品分類分類2名称"
ORDER BY
   T2."納品年",T2."納品月",T1."商品番号",T1."商品名",T4."商品分類分類2名称"
リスト1 パラレル・クエリの検証用SQL
(例)検索期間:年、パラレルクエリの並列度:4の場合。

       1|2|3|4 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。