Hitachi

Hitachi Advanced Data Binder システム構築・運用ガイド


5.2.13 配列型の列の定義【カラムストア表】

HADBでは,順序付けられた一連のデータを要素とする一次元の配列型のデータを扱うことができます(列のデータ型に配列型を定義できます)。表に配列型(ARRAY型)の列を定義すると,複数の配列要素で構成されている配列データを1行にまとめて格納できます。配列型の列を定義した表の例を次の図に示します。

図5‒6 配列型の列を定義した表の例

[図データ]

[説明]

商品表(PRODUCT)に次の配列型の列を定義しています。

  • SIZE(サイズ)

  • COLOR(色)

配列型の列には,通常,1行に1つ以上の配列要素が格納されます。この例の場合,SIZE列には商品のサイズを示す配列要素(SML)が,COLOR列には商品の色を示す配列要素(REDBLUEなど)が格納されます。

なお,表を定義する際,配列要素のデータ型(要素データ型)を指定します。上記の例の場合,SIZE列の要素データ型をCHAR(1)で定義し,COLOR列の要素データ型をVARCHAR(8)で定義しています。要素データ型には,CHAR型やVARCHAR型のほかにINTEGER型やDATE型など,HADBでサポートしているデータ型を指定できます。

メモ

配列型の列を定義した表の定義方法や,検索方法などについては,「11.1.18 配列型の列を定義した実表の運用」を参照してください。

配列型の列を定義しない場合

配列型の列を定義しない場合,次のどちらかのように表を定義することになります。

  • 重複データが多い表を定義する

    (例)

    [図データ]

    この場合,重複データがある行が増えるため,ディスク容量が増加します。

  • 表の正規化を実施して複数の表を定義する

    (例)

    [図データ]

    この場合,重複データを減らすことができますが,複数の表にアクセスする必要があるため,SQL文の実行時に表の結合が必要になります。そのため,SQL文が複雑になったり,検索性能が低下したりするおそれがあります。

配列型の列を定義するメリット
  • データの重複がなくなり,ディスク容量が削減されます。

  • アクセス対象の表が1つになるため,表の結合が不要になり,SQL文がシンプルになります。

  • 関連するデータが物理的に近くに格納されるため,表の結合で複数の表にアクセスするよりも性能面で優れています。

前提条件および制限事項
  • 配列型の列を定義した表は,カラムストア表として定義する必要があります。ローストア表としては定義できません。

    カラムストア表の概要については,「2.2.1 ローストア表とカラムストア表」を参照してください。カラムストア表を設計する際の考慮点については,「5.2.2 ローストア表とカラムストア表の選択基準」を参照してください。

  • 配列型の列を定義した表には,B-treeインデクスおよび一意性制約を定義できません。

  • 配列型の列には,DEFAULT句を指定できません。

  • 配列型の列を定義した表は,SQL文(INSERT文,UPDATE文,DELETE文)による行の追加,更新,および削除ができません

最大要素数の決め方

CREATE TABLE文で表を定義する際,配列型の列の配列要素の最大数(最大要素数)を指定します。最大要素数の指定値が,実際の配列要素の数よりも著しく大きい場合,リソースを必要以上に使用するため,メモリ不足や性能低下の原因となるおそれがあります。そのため,最大要素数には,想定される配列要素の最大数を目安にした値を指定するようにしてください。

なお,最大要素数は,ALTER TABLE文で後から大きくすることができます。ただし,最大要素数を大きくした表に依存するビュー表が無効化されます。ALTER TABLE文による最大要素数の変更方法,およびその際の留意事項については,「11.1.18 配列型の列を定義した実表の運用」の「(4) 最大要素数の変更」を参照してください。

重要

最大要素数を小さくする場合は,CREATE TABLE文で表を再定義する必要があります。

データ用DBエリアに関する留意事項
メモ
  • データ用DBエリアのページサイズおよび1セグメントの容量は,adbinitコマンドまたはadbmodareaコマンドでデータ用DBエリアを作成する際に指定します。

  • 1セグメントの容量は,adbinitコマンドまたはadbmodareaコマンドの-sオプションで指定しますが,-sオプションの指定単位はメガバイト単位になっています。上記の計算式の単位はバイトのため,注意してください。