プログラマ38の日記

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

TERADATA: Primary Partition Indexでパーティション設定

Primary Partition Index(PPI)で検索をさらに早く

TERADATAは、分散したデータに、さらにパーティション設定ができます。

パーティション設定した項目に検索条件を指定すると、フルスキャンではなく該当するパーティションのみスキャンすることができて、性能があがります。

 

例えば次のテーブルで考えます。
Datestring項目には、YYYYMMDD形式で値がセットされる仕様とした場合に、Datestring項目へ検索条件を指定すると該当のパーティションだけスキャンされます。

CREATE SET TABLE Sample1
(
     Datestring     CHAR(8)     CHARACTER SET LATIN CASESPECIFIC
    ,ProductCode    CHAR(10)    CHARACTER SET LATIN CASESPECIFIC
    ,StoreCode      CHAR(10)    CHARACTER SET LATIN CASESPECIFIC
    ,Amount         DECIMAL(6,0) COMPRESS (0)
)
UNIQUE PRIMARY INDEX
(
     Datestring
    ,ProductCode
    ,StoreCode
)
PARTITION BY (ZEROIFNULL(( CAST((Datestring) AS INTEGER))) MOD 65535 ) + 1
;

※上記は8文字の数字のためINTEGERにcastしているが、INTEGERでCASTできない場合(数値に変換した場合にINTEGERの最大値、約20億を超えてしまう場合)はテーブルにデータを登録する際にエラーとなるため注意。

補足としては、Unique Primary Index(以下UPI)を指定した場合は、UPIで指定した項目以外の項目はパーティションを指定することができません。

テーブルのユニーク項目以外の項目でパーティション指定をする場合は、UPIではなく、Primary Indexでテーブル定義をします。(ただし、ユニークであることを保証したい場合は、unique secondary indexをユニーク項目に指定しておくことをお勧めします)

CREATE SET TABLE Sample2
(
UniqueNumber DECIMAL(8) ,Datestring CHAR(8) CHARACTER SET LATIN CASESPECIFIC ,ProductCode CHAR(10) CHARACTER SET LATIN CASESPECIFIC ,StoreCode CHAR(10) CHARACTER SET LATIN CASESPECIFIC ,Amount DECIMAL(6,0) COMPRESS (0) ) PRIMARY INDEX UniqueNumber PARTITION BY (ZEROIFNULL(( CAST((Datestring) AS INTEGER))) MOD 65535 ) + 1 ; 

パーティションの指定の仕方は、上記のように65535の余り+1で指定する場合と、HASHBUCKET(HASHROW(カラム名1,カラム名2)で指定する場合があります。個人的にですが、HASHBUCKET(HASHROW(カラム名1,カラム名2)でテーブル定義をしたことはまだありません。