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)でテーブル定義をしたことはまだありません。