crmprogrammer38の日記

主にDWHやSalesforceのプログラムメモです。

【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で指定することになる。

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)で指定しているテーブルはまだ見たことがありません。