管理の手引き


ノードグループの設計

ノードグループ とは、 1 つのデータベースに属するものとして定義されている 1 つ以上のノードのセットに名前を付けたものです。 データベース・システム構成の一部である各データベース区画は、 db2nodes.cfg と呼ばれる区画構成ファイルの中にすでに定義されていなければなりません。 1 つのノードグループには、最小で 1 つのデータベース区画を、 最大でそのデータベース・システムに定義されたすべてのデータベース区画を 含めることができます。

新しいノードグループを作成するには CREATE NODEGROUP ステートメントを使用し、 変更するには ALTER NODEGROUP ステートメントを使用します。 ノードグループ内では、 1 つまたは複数のデータベース区画を追加または除去することができます。 ノードグループを変更する前に、 データベース区画が db2nodes.cfg ファイルの中に定義されていなければなりません。 表スペースはノードグループ内に存在します。 表は、表スペース内に存在します。

ノードグループが作成または修正されるときには、 区分化マップ がそのノードグループに関連付けられます。 区分化マップは、 区分化キー およびハッシュ・アルゴリズムとともにデータベース・マネージャーによって使用され、 ノードグループ内のどのデータベース区画が特定のデータの行を保管するかが決められます。 区分化マップについて詳しくは、区分化マップを参照してください。 区分化キーについて詳しくは、区分化キーを参照してください。

非区分データベースでは、区分化キーおよび区分化マップは必要ありません。 非区分データベースを使用している場合には、 ノードグループについての設計上の考慮事項はありません。 データベース区画 とはデータベースの一部分であり、 ユーザー・データ、索引、構成ファイル、 およびトランザクション・ログで構成されます。 データベースが作成されたときに作成された省略時のノードグループは、 データベース・マネージャーによって使用されます。 IBMCATGROUP は、システム・カタログが入っている表スペースの省略時ノードグループです。 IBMTEMPGROUP は、システム一時表スペース用の省略時ノードグループです。 IBMDEFAULTGROUP は、ユーザーがそこに書き込むことを選択できる、 ユーザー定義の表が入る表スペース用の省略時ノードグループです。 宣言済み一時表のためのユーザー一時表スペースは IBMDEFAULTGROUP または 任意のユーザー作成ノードグループの中に作成できますが、 IBMTEMPGROUP の中には作成できません。

複数区画のノードグループを使用している場合は、以下の設計のポイントを考慮してください。

小さな表は、 大きな表との併置 を利用したい場合を 除き、単一区画ノードグループの中に置いてください。 併置とは、同じデータベース区画にある、 関連データが入った複数の異なる表から行を配置することです。 併置された表を使用して、 DB2 は結合ストラテジーをより効率的に利用することができます。 併置された表は、 1 つの単一区画ノードグループの中に存在することができます。 複数の表が 1 つの複数区画ノードグループの中に存在し、 区分化キーの中に同数の列を持ち、 対応する列のデータ・タイプが区画互換である場合、 それらの表は併置されているとみなされます。 同じ区分化キー値を持つ併置された表の中の行は、同じデータベース区画に置かれます。 それぞれの表が同じノードグループの中の別個の表スペースの中に入っていても、 併置されているとみなされます。

中間サイズの表を、あまりに多くのデータベース区画にわたって拡張することは避けるべきです。 たとえば、100 MB の表の場合、32 区画ノードグループ上よりも、 16 区画ノードグループ上のほうがパフォーマンスが良くなります。

ノードグループを使用して、 オンライン・トランザクション処理 (OLTP) の表を意思決定支援の表と分離して、 OLTP トランザクションのパフォーマンスが影響を受けて低下しないようにすることができます。

ノードグループ設計についての考慮事項

データベースを区分化する必要があるかどうかは、論理データベースの設計内容、 および処理するデータの量によって判断が可能です。 このセクションでは、データベースの区分化について次のようなトピックを扱います。

データの区分化

DB2 は、データベース内の複数のデータベース区画にわたってデータを保管できるようにする、 区分化記憶モデルをサポートしています。 つまり、 データが物理的には複数のデータベース区画にわたって保管されていても、 1 つの同じ場所に置かれているかのようにアクセスできます。 区分化されたデータベースのデータにアクセスするアプリケーションやユーザーは、 データが物理的にどこにあるかを認識する必要がありません。

データは、物理的には分割されていますが、 1 つの論理的な統一体として使用および管理されます。 ユーザーは、区分化キーを宣言することによって、 自分のデータを区分化する方法を選択することができます。 ユーザーはまた、 データを保管すべき表スペースと関連するノードグループを選択することによって、 自分のデータを展開できるデータベース区画を指定したり データベース区画の数を決定することもできます。 さらに、更新可能な区分化マップをハッシュ・アルゴリズムとともに使用して、 データベース区画への区分化キー値のマッピングを指定します (これによって データの各行の配置と検索が決まります)。 その結果、大きな表のための作業負荷を区分データベース全体に分散させると同時に、 小さい表を 1 つまたは複数のデータベース区画に保管することができます。 それぞれのデータベース区画は保管するデータのローカル索引を持っており、 その結果、ローカルのデータ・アクセスのパフォーマンスが向上します。

すべての表を、データベース内のすべてのデータベース区画に 分割しなければならないという設計上の制限はありません。 DB2 は部分デクラスター をサポートします。 これによって、表および表スペースをシステム内のデータベース区画の サブセット (つまりノードグループ) に分割できます。

それぞれのデータベース区画に表を置きたいときに考慮できる別の方法は、 要約表を使用してからそれらの表を複写するというものです。 まず必要な情報を含む要約表を作成して、それを各ノードに複写します。 詳しくは、複製要約表を参照してください。

区分化マップ

区分データベース環境では、 どのデータベース区画に表のどの行が保管されているかを データベース・マネージャーが何らかの方法で認識する必要があります。 データベース・マネージャーは必要なデータの場所を認識する必要があり、 データを見付けるために区分化マップ という マップを使用します。

区分化マップは内部で生成された配列であり、 複数区画ノードグループの場合は 4 096 項目が、単一区画ノードグループの場合は単一の項目が入っています。 単一区画ノードグループの場合、区分化マップの項目は 1 つのみで、 そこには、データベース表のすべての行が保管されているデータベース区画の区画番号が入っています。 複数区画ノードグループの場合、ノードグループの区画番号は、 ラウンドロビン方式で指定されます。 都市の地図が格子状のセクションで構成されているように、 データベース・マネージャーは、区分化キー を使用して、 データが保管されている場所 (データベース区画) を判別します。

たとえば、 4 つのデータベース区画 (0 〜 3 の番号が付けられている) 上に作成されたデータベースがあるとします。 このデータベースの IBMDEFAULTGROUP ノードグループの区分化マップは、次のようになります。

   0 1 2 3 0 1 2 ...

データベース区画の 1 および 2 を使用してノードグループがデータベース内に作成されている場合、 そのノードグループの区分化マップは、以下のようになります。

   1 2 1 2 1 2 1 ...

データベースにロードされる表の区分化キーが 1 と 500 000 の間の可能値を持つ整数である場合、 区分化キーは、0 と 4 095 の間の区分番号になるようハッシュが行われます。 この番号は、その行のデータベース区画を選択するための区分化マップの索引として使用されます。

図 35 は、区分化キー値 (c1, c2, c3) を持つ行が、区画 2 にマップされ、 次に区画 2 がデータベース区画 n5 を参照する方法を示しています。

図 35. 区分化マップを使用したデータ配分

区分化マップを使用したデータ配分

区分化マップは、 区分データベースのどこにデータが保管されるかを制御するための柔軟性のある手段です。 データベース内のデータベース区画にわたるデータ配分を将来変更する必要がある場合、 データ再配分ユーティリティーを使用することができます。 このユーティリティーによって、データ配分のバランスをとり直したり、 データ配分にスキューを導入したりすることができます。 このユーティリティーについての詳細は、 管理の手引き: パフォーマンス の『データベース区画間でのデータの再配分』を参照してください。

表区分情報入手 (sqlugtpi) API を使用して、 見ることができる区分化マップのコピーを入手することができます。 この API についての詳細は、管理 API 解説書 を参照してください。

区分化キー

区分化キー とは、 特定のデータの行が保管される区画を判別するために使用される 1 つの列 (または列のグループ) のことです。 区分化キーは、CREATE TABLE ステートメントを使用して表の上に定義されます。 ノードグループ内の複数のデータベース区画にわたって分割された表スペース内の表に対して区分化キーが定義されていない場合、 省略時解釈によって、区分化キーが基本キーの最初の列から作成されます。 基本キーが指定されていない場合は、省略時解釈の区分化キーは、 その表に定義された最初のロング・フィールド列以外の列になります。 (ロング には、 すべてのロング・データ・タイプとすべてのラージ・オブジェクト・データ・タイプが含まれます。) 単一区画ノードグループに関連した表スペースの中に表を作成している場合、 区分化キーが必要であれば、区分化キーを明示して定義しなければなりません。 省略時解釈では、区分化キーは作成されません。

省略時の区分化キーの要件を満たす列がない場合、表は区分化キーなしで作成されます。 区分化キーのない表は、単一区画ノードグループでのみ使用できます。 後で、ALTER TABLE ステートメントを使用して区分化キーを追加 または除去することができます。 区分化キーの変更は、単一区画ノードグループに関連した表スペースにある 表に対してのみ行うことができます。

適切な区分化キーを選択することが重要です。 以下のような事柄を考慮してください。

併置が主な考慮事項ではない場合、表に対する適切な区分化キーは、 ノードグループ内のすべてのデータベース区画に均等にデータが分散するような区分化キーです。 ノードグループに関連する表スペースの中のそれぞれの表に対する区分化キーによって、 その表が併置されているかどうかが判別されます。 表は、以下の場合に併置されていると考えられます。

これによって、同じ区分化キー値を持つ併置された表の各行が、 確実に同じ区画に配置されるようになります。 区画互換について詳しくは、区画の互換性を参照してください。 表の併置について詳しくは、表の併置を参照してください。

区分化キーが不適切であると、データの分配が不均一になる可能性があります。 不均一に分配されたデータを持つ列、および異なる値の数が少ない列は、 区分化キーとして選択すべきではありません。 異なる値の数は、ノードグループ内のすべてのデータベース区画にわたって行を均等に分配するのに十分な大きさでなければなりません。 区分化ハッシュ・アルゴリズムを適用するためのコストは、区分化キーのサイズに比例します。 区分化キーは 16 列より多くできず、列が少ないほどパフォーマンスは良くなります。 不必要な列は、区分化キーの中に含めるべきではありません。

区分化キーを定義する場合には、以下の点を考慮する必要があります。

ハッシュ区分化 とは、 区分表内の各行の配置を決定する方式です。 この方式は、以下のようなしくみです。

  1. ハッシュ・アルゴリズムが、区分化キーの値に適用され、 ゼロと 4095 の間の区分番号を生成します。
  2. ノードグループが作成されるときに、区分化マップが作成されます。 区分番号のそれぞれは、区分化マップを充てんするために、ラウンドロビン方式で順番に繰り返されます。 区分化マップについて詳しくは、区分化マップを参照してください。
  3. 区分番号は、区分化マップへの索引として使用されます。 区分化マップの中のその場所にある番号は、 その行が保管されているデータベース区画の番号になります。

表の併置

ある種の照会の応答で、 特定の複数の表のデータが頻繁に使われる場合があります。 このような場合、 これらの表からの関連データをできるだけ近接して配置する必要があります。 データベースが物理的に 2 つ以上のデータベース区画に分割されている環境では、 分割された表の関連する部分を、 何らかの方法でできるだけ近接するように維持する必要があります。 これを行うための機能を表の併置 と呼びます。

表は、同じノードグループ内に保管される場合、 およびそれらの区分化キーが互換性がある場合に併置されます。 両方の表を同じノードグループに置くことによって、 共通の区分化マップにすることができます。 これらの表は異なる表スペースの中にあってもかまいませんが、 その表スペースは同じノードグループに関連付けられていなければなりません。 各区分化キーの中の対応する列のデータ・タイプは、 区画互換 でなければなりません。 区画互換性の詳細については、区画の互換性を参照してください。

DB2 には、結合または副照会で複数の表にアクセスするときに、 結合すべきデータが同じデータベース区画に配置されていることを認識する機能があります。 同じデータベース区画内に配置されている場合、 DB2 は、データをデータベース区画間で移動する代わりに、 そのデータが保管されているデータベース区画で結合または副照会を 実行することができます。 データベース区画で結合または副照会を実行するこの機能によって、 大きなパフォーマンス上の利点が得られます。 詳細については、 管理の手引き: パフォーマンス の『併置結合』を参照してください。

区画の互換性

区分化キーの対応する列の基本データ・タイプを比較して、 区画互換 として宣言することができます。 区画互換データ・タイプは、同じ値を持つ 2 つの変数 (それぞれのタイプに 1 つの変数) が、 同じ区分化アルゴリズムによって同じ区分番号にマップされるという特性を持っています。

区画の互換性は、以下の特性を持ちます。

複製要約表

要約表 は、 表の中のデータの判別にも使われる照会によって定義される表です。 要約表を使って、照会のパフォーマンスを向上させることができます。 照会の一部は要約表を使って解決できると DB2 が判断した場合、データベース・マネージャーは、 その照会が要約表を使用するように書き換えます。

区分データベース環境では、要約表を複製することができます。 照会のパフォーマンスを向上させるために、 複製要約表 を使用できます。 複製要約表には単一区画ノードグループで作成された表に基づくものもありますが、 これをノードグループ内のすべてのデータベース区画にわたって 複製することもできます。 複製要約表を作成するには、 REPLICATED キーワードを指定して CREATE TABLE ステートメントを呼び出します。 REPLICATED キーワードは、 REFRESH DEFERRED オプションとともに定義された要約表に対してのみ指定できます。

要約表について詳しくは、 要約表の作成 を参照してください。

複製要約表を使用することによって、 一般的には連結されていない表の間で連結を行うことができます。 複製要約表は、 1 つの大きいファクト表と小さいディメンション表のある結合について特に役立ちます。 必要とされる余分の記憶域を最小限にし、 すべてのレプリカを更新しなければならないことによる影響を最小限にとどめるには、 複製する表は小さく、頻繁に更新されるものでなければなりません。
注:また、頻繁に更新されない大きい表を複製することも考慮する必要があります。 この場合、一回限りの複製に多大なコストがかかりますが、 連結によって得られるパフォーマンス上の益によって相殺されます。

複製表の定義に使われる副選択文節で適切な述部を指定することによって、 選択した列、選択した行、またはその両方を複製できます。

複製要約表についての詳細は、 SQL 解説書 の CREATE TABLE ステートメントを参照してください。 併置結合について詳しくは、 管理の手引き: インプリメンテーション の『併置結合』を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]