目次
はじめに
本記事は、Verticaのデータ配置方法をご紹介します。
セグメンテーションとは
複数ノード構成の場合、Verticaでは分散処理のために、サイズの大きなプロジェクションのデータを各ノードに分散して保持します。これをセグメンテーションといいます。これによりクエリ実行時のシェアードナッシングによる分散処理が実現され、パフォーマンスが向上します。
レプリケーションとは
複数ノード構成で、セグメンテーション化して分散するほどではない小さなプロジェクション(例 ディメンジョン表)の場合は、セグメンテーション化せずプロジェクションの完全コピーを各ノードに配置します。 Verticaではこれをレプリケーションといいます。
セグメンテーション/レプリケーションの使い分け
一般的には、ファクト表のようなサイズの大きなプロジェクションはセグメンテーション化し、ディメンジョン表のような小さなプロジェクションはレプリケーション化します。
これにより、ファクト表とディメンジョン表の結合処理時に各ノードのローカル内で結合処理が完結するようになります。ディメンジョン表もセグメンテーション化した場合と比べると、結合時のネットワークオペレーションが最小化されるため、より高速な処理が可能になります。
例)ローカル結合のイメージ
以下、レプリケーション化とセグメンテーション化を使い分ける必要性について具体的なイメージをご案内いたします。
■ファクト表、ディメンジョン表ともにセグメンテーション化した場合
結合処理時に他のノードのデータを参照しなければならないケースが発生します。 例えば、店舗IDが10のデータの結合処理の場合はノード2、3は自身のノードで結合処理を完結できないため、非効率な処理となります。
■ファクト表をセグメンテーション化、ディメンジョン表をレプリケーション化した場合
ディメンジョン表をレプリケーション化しているため、結合処理時に必要なデータはすべて自身のノードにあります。 他のノードのデータを参照する必要がないため、効率の良い処理となります。
以上のように、必要に応じてレプリケーション化とセグメンテーション化を使い分ける必要がございます。
プロジェクションをセグメンテーションおよびレプリケーションする基準
Verticaでは、プロジェクションをレプリケーション化するか、セグメンテーション化するかは、Database Designerでプロジェクションを作成する際に以下のフローで自動的に判断します。
■自動判断フロー
2.全プロジェクションの中で、最もデータ件数が多いプロジェクションを見つける。
3.「最もデータ件数が多いプロジェクション」と「それ以外のプロジェクション」のデータ件数を比較する。
4.比較結果に基づき、各プロジェクションを「セグメンテーション化」もしくは「レプリケーション化」する。
また、上記以外にセグメント化されないケースもございます。セグメントされないケースは以下2つです。
2.対象のテーブルにLONG VARCHAR および LONG VARBINARY 列が含まれている。
セグメンテーション化されているか確認する方法
プロジェクションがセグメンテーション化されているか確認する場合は、projectionsテーブルを参照します。
例)LINEORDER_seg_b0プロジェクションを確認する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
dbadmin=> SELECT * FROM projections WHERE projection_name='LINEORDER_seg_b0'; -[ RECORD 1 ]------------+-------------------------------------------------- projection_schema_id | 45035996273736160 projection_schema | ssbm projection_id | 49539595901104158 projection_name | LINEORDER_seg_b0 projection_basename | LINEORDER_seg owner_id | 45035996273704962 owner_name | dbadmin anchor_table_id | 45035996273736164 anchor_table_name | LINEORDER node_id | 0 node_name | is_prejoin | f created_epoch | 187 create_type | DESIGNER verified_fault_tolerance | 1 is_up_to_date | t has_statistics | t is_segmented | t segment_expression | hash(LINEORDER.LO_ORDERKEY) segment_range | implicit range: v_test_node0003[33.3%] v_test_node0001[33.3%] v_test_node0002[33.3%] is_super_projection | t has_expressions | f is_aggregate_projection | f aggregate_type | |
セグメンテーションの情報は以下の列で確認できます。
[projectionsシステムテーブル]
列名 | 内容 |
---|---|
is_segmented | セグメンテーション化されている場合は「t」、レプリケーション化されている場合は「f」 |
segment_expression | セグメント方式※例の場合はLO_ORDERKEYをキーにハッシュ分散 |
segment_range | セグメント対象のノード及び、ノードごとのデータの分散状況(%) |
検証バージョンについて
この記事の内容はVertica 12.0で確認しています。