Comments
Transcript
DWH設計ガイド 2章.区分化によるアクセス効率の向上 第 ビジネス・ユニットの名前
ビジネス・ユニットの名前 DWH設計ガイド 第2章.区分化によるアクセス効率の向上 PSU_temp_0522 <第1.11版 2009年 2月> 本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布されるものです。 この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用する環境に統合する 使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べられていますが、他のところで同じまたは同 様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使用先は、自己の責任において行う必要があります。 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 2009/3/178/3/05 この文書のデータの利用または公開には、 最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 内容 第1章.大規模DBへの挑戦 第2章.区分化によるアクセス効率の向上 – パーティションDB – パーティション表 – マルチディメンション・クラスタリング(MDC)表 – ハイブリッド構成 第3章.圧縮によるストレージ格納効率の向上 第4章.大規模ワークロードの管理(WLM) PSU_temp_0522 2 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 第2章.区分化によるアクセス効率の向上 1.パーティションDB – パーティションDB(DPF)の概要 • シェアード・ナッシング・アーキテクチャー • データの分散 – パーティションDBの設計 • • • • 分散キーの選択 均一なデータ分散 結合の種類 Join時のデータ移動の最小化 • 表の配置 • 大量データの更新 • 大量データの抽出 – 考慮点 PSU_temp_0522 3 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDB(DPF)の概要 ハッシングによるデータ分散 – シェアード・ナッシング・アーキテクチャー 大規模DBの実現 Interconnect – SQL、ユーティリティの 高速並列処理 – 巨大な表、表スペース、 バッファープール ハッシングによるデータ分散 – 複数サーバーによる インスタンス構成 Database Partitioning Feature(V8/V9) 表 T1 表 T1 表 T1 DB パーティション1 DB パーティション2 表 T1 InfoSphere Warehouse (V9.5) – InfoSphere Balanced Warehouse に採用されている (初期導入/DB構成済み) PSU_temp_0522 4 DB パーティション0 DB パーティション3 CREATE TABLE T1 ( COL1 INT, COL2 CHAR(3) ) DISTRIBUTE BY (COL1) © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 シェアード・ナッシング・アーキテクチャー(1/2) 各DBパーティションは、独立した処理エンジン、資源を保持 – 各DBパーティションが別々に処理エンジンを持ち、データやログ、ロック、キャッシュな ど全てを別々に管理 – 各DBパーティションがお互いに影響を及ぼさないため、高い性能、拡張性を実現可能 高速通信マネージャー DBパーティション データ ログ データ ログ データ ログ データ ログ データベース PSU_temp_0522 5 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 シェアード・ナッシング・アーキテクチャー(2/2) アプリケーションにはひとつのDBイメージ – データの配置を意識せず、どのパーティションからでも処理可能 – アプリケーションからリクエストされたクエリーは自動的に各DBパーティションに送信され、 並列に処理 SELECT COUNT(*) FROM T1 各DBパーティション に処理要求を配信 し、結果をマージ コーディネーター・ エージェント PSU_temp_0522 6 サブ・エージェント データ ログ データ ログ データ ログ データ ログ © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 データの分散 Customer cust_id 10 20 30 40 50 CREATE TABLE CUSTOMER( cust_id INT, name VARCHAR(80), gender CHAR(5)) DISTRIBUTE BY(cust_id) IN TBSP01; cust_idを分散 キーとして選択 指定した表スペース の分散配置通りに表 も分散される 10 name 中村 東 山村 古川 堀部 gender F M M M F 分散キーの値から得られ るハッシュ値と分散マップ によって対象のパーティ ションが決定する Hash(cust_id) 分散マップ 中村 30 0 1 2 3 4 5 6 7 … 4095 0 1 2 0 1 2 0 1 2 0 CUSTOMER F 山村 M 20 東 7 DBパーティション0 DBパーティション0 M M 50 PSU_temp_0522 古川 40 DBパーティション1 DBパーティション1 堀部 F DBパーティション2 DBパーティション2 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(分散キーの選択) 分散キーの選択 – 分散キーを適切に選択することで、パーティション間に均一に負荷が分散され、最適なパ フォーマンスを得ることができる ★分散キーの候補となる列 カーディナリティ(値のばらつき)の高い列 各パーティションへ格納される行の均一化 ○: 取引番号、顧客番号など ×: 有効フラグ、性別 各区分への均等なデータアクセスの発生 特定の値にアクセスが集中しないような列 ○: 取引番号、顧客番号など ×: 取引日付など 結合処理を最も効率よく行うことができる 結合列として使われる列 ★分散キーの選択時の考慮点 多くの列を指定しない ハッシングのコスト軽減のため プライマリー・キー、ユニーク索引には、必ず分散キー を含める 分散キー選択の際の制約 LONG列は使用不可 PSU_temp_0522 8 分散キーの定義変更は不可 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(均一なデータ分散) 設計時のポイント – 均一なデータ分散 • • 選択した分散キーのカーディナリティが低かった場合など、パーティション間でデータにばらつきが発生すると、パ フォーマンス、CPU、メモリーリソースに悪影響を及ぼす 分散キー候補が他にない場合は、REDISTRIBUTE DATABSE PARTITION GROUPコマンドのUNIFORMオプ ションにより、データの均一化が可能 Interconnect 対象データ量が多いため、処理 時間、CPU、メモリーリソースが 他と比較して大きくなる 不均一なデータ分散 表 T1 PSU_temp_0522 9 DB パーティション0 表 T1 表 T1 表 T1 DB パーティション1 DB パーティション2 DB パーティション3 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(結合の種類) 外部表、内部表のデータの移動有無による結合の種類 – ユーザー側で明示的に結合の種類を選択することはできない – オプティマイザにより、分散キー、Joinキー、表の大きさにより最適な結合が選択される – DPF特有の4つの結合 • • • • 詳細は「参考」を参照 コロケーテッド結合 外部表のブロードキャスト結合 外部表の指示結合 内部表、外部表の指示結合 – 通常のJoinはデータ移動後に実施される • Nested Loop Join、Merge Join、Hash Joinなど 外部表 内部表 備考 コロケーテッド結合 データ移動なし データ移動なし 最も効率的な結合 「分散キー = Joinキー」 外部表の ブロードキャスト結合 全パーティション にコピー データ移動なし 外部表が小さなマスター表である場合などに選 択されやすい 外部表の指示結合 Joinキーで再度 ハッシュ データ移動なし 外部表は 「分散キー ≠ Joinキー」 内部表、外部表の指示結合 Joinキーで再度 ハッシュ Joinキーで再度 ハッシュ パーティション間をデータが飛び交う結合 内部表、外部表ともに 「分散キー ≠ Joinキー」 PSU_temp_0522 10 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(Join時のデータ移動の最小化) 設計時のポイント – Join時のデータ移動の最小化 • Join時にパーティション内でJoin処理が完結するように設計する – 例) CUST表、SALES表のJoin • データ移動が発生しないケース – 分散キー、Joinキーが共にCUST_IDとなるJoin • データ移動するケース – Joinキーが分散キーと異なるJoin 【データ移動が発生しないケース】 【データ移動するケース】 CUST : dk (CUST_ID) 1 3 11 パーティション1 1 2 SALES : dk (CUST_ID) 1 3 2 1 2 PSU_temp_0522 CUST : dk (CUST_ID) パーティション2 再分配され ずにJoin処 理が可能 3 2 SALES : dk (other_ID) 1 3 1 2 2 パーティション1 CUST_IDに より再分配 される パーティション2 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(表の配置) 設計時のポイント – 表の配置 • 他の表で使用されている分散キーを含まないような小さなマスター表は分散配置させない – 例) マスター表、トランザクション表のJoin ① マスター表をハッシングすることなく、トランザクション表の存在するパーティションへBroadcast (表をコピーするイメージ) ② 各パーティションで結合を実施 さらなる改善策(MQT利用) ①マスター表を 各パーティション にBroadcast (表のコピー) 【マスター表のBroadcast】 マスター表 1 234 マスター表 マスター表 マスター表 JOIN JOIN JOIN JOIN トランザクション表 1 1 1 PSU_temp_0522 パーティション1 12 3 3 パーティション2 4 パーティション3 2 MQTを利用することで、Select文発行時 MQTを利用することで、Select文発行時 にマスター表をBroadcastすることなく、既に にマスター表をBroadcastすることなく、既に レプリカされているMQTを利用させる。 レプリカされているMQTを利用させる。 ②各パーティショ ンで結合 2 パーティション4 CREATE TABLE R_マスター表 AS ( SELECT ・・・ FROM マスター表 ) DATA INITIALLY DEFFERRED REFRESH IMMEDIATE IN TBSP01 REPLICATED; 複製する表は小さく、更新頻度の低いも 複製する表は小さく、更新頻度の低いも のを推奨 のを推奨 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(大量データの更新) 設計時のポイント – 大量データの更新処理(その1) • 複数のパーティションに同時に仕事をさせること – 1行INSERTの繰り返しなど、複数パーティションを同時に仕事をさせることが難しい場合には、複数JOBの並列 実行も検討 – または、ひとつのSQLが各パーティションで並列処理されるように工夫する • 例: INSERT_UPDATEモードで実行するIMPORT 詳細は後述 – IMPORT実行をしているパーティションから各パーティションへシーケンシャル処理される import from file of del insert_update into tbl; 詳細は後述 • 代替策: 一時表へLOADしてからMERGE load from file of del replace into temp_t; merge into tbl a using temp_t b on a.pkey=b.pkey when matched then update set col01=b.col01 when not matched then insert (pkey,col01) values (b.pkey,b.col01); PSU_temp_0522 13 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計 INSERT_UPDATEモードで実行するIMPORT INSERTやUPDATEは入力データ1行毎に順番に処理される コーディネーターと各ターゲットとの間で多くの回数送受信が 発生する Import Import from from file file of of del del insert_update insert_update into into tbl; tbl; 一時点では、一つのパーティションがINSERT/UPDATEを 行っているだけであり、スケーラビリティの得られない形態 0 Update -803 Insert part0 part0 part1 part1 part2 part2 HASH part3 part3 WRITE Insert PSU_temp_0522 14 Update Sqlcode -803 Sqlcode 0 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計 一時表へLOADしてからMERGEを実行する方法 すべての処理が全パーティションで並列実行 アプリケーションとDBの間、DBパーティション間の送受信フ ローを最小にすることができる 1. 1. Load Load from from file file of of del del replace replace into into temp_t; temp_t; LOAD temp_t part0 part0 15 LOAD temp_t MERGE MERGE PSU_temp_0522 2. 2. Merge Merge into into tbl tbl using using table_tmp table_tmp tbl part1 part1 LOAD temp_t part2 part2 temp_t MERGE MERGE tbl LOAD tbl part3 part3 tbl © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(大量データの更新) 設計時のポイント – 大量データの更新処理(その2) • 区分化された表間でデータを並列に高速コピーする – カーソルLoadの「DATABASE」オプションと、「FETCH_PARALLELISM」オプションを利用 – 区分化マップが同じ場合には、複数パーティションより並列にデータ抽出し、データをハッシュすることなく複数 パーティションで並列にLoadする(ただし、WHERE条件を指定すると、データはハッシュされてしまう) • 例: 本番DBの明細表から検証DBの明細履歴表にデータを高速にコピーする – 「DATABASE」オプションに別のDB名を指定することでDB間の高速データコピーが可能 > 同じDB名を指定すればDB内での表間の高速コピーが可能 connect to 検証DB; declare c1 cursor database 本番DB user dpf95 using dpf95 for select * from 明細表 ; load from c1 of cursor insert into 明細履歴表 fetch_parallelism yes; PSU_temp_0522 16 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 パーティションDBの設計(大量データの抽出) 設計時のポイント – 大量データの抽出処理 • 複数のパーティションに同時に仕事をさせること – Exportユーティリティでは、最後にコーディネータパーティションでファイルに出力する処理がネックになりやすい – 大量のデータがパーティション間を流れる • 代替策: db2_allを使用して複数パーティションでローカルにファイルを出力する(AIXの例) db2_all ¥"¥│¥│" ¥ db2 connect to sample; ¥ db2 'export to /data/emp.00## of del ¥ select * from employee ¥ where dbpartitionnum (empno) = current dbpartitionnum' ¥ " – db2_allの「”」は、「##」の部分をデータベース・パーティション番号に置換させる接頭部シーケンス – db2_allの「||」は、バックグラウンドでコマンドを並列に実行させる接頭部シーケンス (*)db2_allの接頭部シーケンスには、kshに文字列として認識させるために「¥」をつけている PSU_temp_0522 17 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 考慮点 カタログ・パーティションの重要性 – システム・カタログ表が含まれるパーティションが「カタログ・パーティション」 – CREATE DATABASEしたパーティション – 全ての接続はカタログ・パーティションにも接続される – カタログ・パーティションがDownすると全接続が使用不可になる インスタンス・オーナーのHOME – 各パーティションからNFSなどを利用して共有する必要がある • NFSサーバーがDownすると処理の継続はできなくなる • カタログ・パーティションとNFSサーバーは同一とすることを推奨 リモート・コマンドを実行できるようにする – すべてのデータベース・パーティションに対し、リモート・コマンドを実行する権限が必要 – インスタンス・オーナーのHOMEに.rhostsを用意する(sshの利用も可能) PSU_temp_0522 18 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 考慮点 コーディネータ・パーティション – SQL発行のために接続したパーティションが「コーディネータ・パーティション」 – どのパーティションもコーディネータになり得る – コーディネータ・パーティションに負荷がかかる場合(多くの同時トランザクションや検索の アンサーセットが多いときなど)は、複数のコーディネータ・パーティションを用意 分散キーの設計 詳細は前述 – データを均一に分散させるために分散キーの選択が重要 PSU_temp_0522 19 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 参考:パーティションDBの設計(結合の種類) コロケーテッド結合 select * from cust c,sales s where c.cust_id=s.cust_id 1 1 2 2 3 1 1 2 2 3 パーティション0 CUST表とSALES表の分散キーは共 にCUST_ID 2つの表の結合列もCUST_ID 結合は各パーティション内の行同士 のみで実施される q1 1 1 3 1 1 3 q1の読み取り 結果のリターン q1 2 2 2 2 CUST : dk (CUST_ID) 1 3 2 SALES : dk (CUST_ID) 1 3 2 1 2 パーティション1 PSU_temp_0522 20 パーティション2 CUST表のスキャン SALES表のスキャン 結合処理 q1への挿入 CUST表のスキャン SALES表のスキャン 結合処理 q1への挿入 パーティション1 パーティション2 © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 参考:パーティションDBの設計(結合の種類) 外部表の ブロードキャスト結合 2つの表の結合列は、共に CUST_ID以外の列 結合は各パーティション内だけでは 実現できないため、各パーティション へCUST表の内容をBroadcast q1 CUST : dk (CUST_ID) 2 3 SALES : dk (CUST_ID) 1 3 1 2 2 パーティション1 PSU_temp_0522 21 パーティション2 1 1 2 2 3 ③結合結果 を受け取る パーティション0 CUST表とSALES表の分散キーは 共にCUST_ID 1 1 1 2 2 3 select * from cust c,sales s where c.other_id=s.other_id 1 2 q2 1 2 3 1 2 3 q1の読み取り 結果のリターン ②SALES表 のパーティション で結合 SALES表のスキャン q2の読み取り 1 2 結合処理 3 q1へ挿入 2 CUST表のスキャン q2へ挿入 (Broadcast) パーティション1 1 q1 1 2 1 2 SALES表のスキャン q2の読み取り 1 2 結合処理 3 q1へ挿入 1 2 3 3 q2 q2 3 CUST表のスキャン q2へ挿入 (Broadcast) q2 パーティション2 ①CUST表 CUST表を 全パーティション を全パーティ ションに送る に送る © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 参考:パーティションDBの設計(結合の種類) 1 1 2 2 3 select * from cust c,sales s where c.cust_id=s.cust_id 外部表の指示結合 1 1 2 2 3 ③結合結果 を受け取る パーティション0 CUST表の分散キーはCUST_ID SALES表の分散キーはother_ID 2つの表の結合列は、共にCUST_ID q1 結合処理のため、SALES表の各行を CUST_IDの値でハッシングし、適切な パーティションへ送信 CUST : dk (CUST_ID) 1 3 2 SALES : dk (other_ID) 1 3 1 2 2 パーティション1 PSU_temp_0522 22 パーティション2 1 3 q2 1 1 3 1 1 3 q1の読み取り 結果のリターン ②CUST表 のパーティション で結合 CUST表のスキャン q2の読み取り 1 結合処理 3 1 q1へ挿入 q1 2 2 2 2 CUST表のスキャン q2の読み取り 2 2 結合処理 q1へ挿入 2 SALES表のスキャン CUST_IDでHASH q2へ挿入 (Directed) パーティション1 2 1 q2 q2 SALES表のスキャン CUST_IDでHASH q2へ挿入 (Directed) q2 ①SALES表を パーティション2 ハッシングして各 パーティションに送る © Copyright IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 ビジネス・ユニットの名前 参考:パーティションDBの設計(結合の種類) 内部表と外部表の 指示結合 1 1 2 2 3 select * from cust c,sales s where c.cust_id=s.cust_id 1 1 2 2 3 ③結合結果 を受け取る パーティション0 CUST表とSALES表の分散キーは共に other_ID 2つの表の結合列は、共にCUST_ID 結合処理のため、2つの表の各行を CUST_IDの値でハッシングし、適切な パーティションへ送信 q1 CUST : dk (other_ID) 1 2 SALES : dk (other_ID) 1 3 1 2 2 パーティション1 PSU_temp_0522 23 1 3 3 パーティション2 q3 1 q2 1 1 3 1 1 3 q2の読み取り q3の読み取り 結合処理 q1へ挿入 q1の読み取り 結果のリターン ②キューのデータ を読み取って 結合 q1 2 2 2 2 q2の読み取り q3の読み取り 結合処理 q1へ挿入 SALES表のスキャン CUST_IDでHASH q3へ挿入 q3 2 q3 1 SALES表のスキャン CUST_IDでHASH q3へ挿入 CUST表のスキャン CUST_IDでHASH q2へ挿入 2 3 q2 q2 CUST表のスキャン CUST_IDでHASH q2へ挿入 2 q3 q2 ①2表ともハッシング パーティション2 して各パーティション © Copyrightに送る IBM Japan Systems Engineering Co., Ltd. 2008 この文書のデータの利用または公開には、最終ページに記載されている制限事項が適用されます。 パーティション1