プログラマ38の日記

主にプログラムメモです。

TERADATA: PRIMARY INDEXは、データの分散のキー

PRIMARY INDEXは分散の指定です

TERADATAは、データを分散して管理していて、その分散用のキーとしてPRIMARY INDEXを指定します。


CREATE SET TABLE SAMPLE
(
    ,LATINFIELD       CHAR(2)       CHARACTER SET LATIN CASESPECIFIC NOT NULL
    ,UNICODEFIELD     VARCHAR(9)    CHARACTER SET UNICODE CASESPECIFIC
)
[UNIQUE] PRIMARY INDEX
(
     LATINFIELD
);

上記ようにさらにuniqueを指定することもできます。

uniuqueを指定するといわゆるPrimaryKeyと同じ気がしますが、あくまで分散用のキーのPrimary IndexにUnique制約を追加したものになります。また、primary indexに指定した項目はnullでも問題ありません。

 

PRIMARY INDEXに指定した項目の更新は避けよう

TERADATAはPPRIMARY INDEXで指定した項目のハッシュ値を元にデータを分散しています。なのでPRIMARY INDEXで指定した項目の値が変更されるとハッシュ値が変わりデータを再度ハッシュ値に基づき分散します。(再配置)

ファクトテーブルなど件数が多いテーブルのPRIMARY INDEXを更新すると非常に時間がかかります。

業務要件で洗い替えが必須要件なのであれば、洗い替えを行う項目をPRIMARY INDEXに指定するのはやめましょう。

どうしても洗い替えを行うのであれば、updateではなく、別のテーブルへinsertした方が早い場合があります。

 

Compressを指定したい項目はPRIMARY INDEXに指定できない

区分などほぼ値が決まっている項目はcompressを指定したくなりますが、PRIMARY INDEXには指定できなくなります。データのばらつき具合とcompressをかけるメリットを比較してより良い方を選択することになります。

 

最後に

TERADATAが高速である理由はデータを分割して保持しているからです。1人で全体を探すのではなく、10人で10個に分割されたデータを探した方が早いというような単純な理屈ですが、これを実現するのがPRIMARY INDEXです。データベースの性能を十分に引き出すためにもある程度根拠を持って定義したいところです。(適当に設定しても十分早いのですけどね。。)