プログラマ38の日記

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

TERADATA: Primary Partition Index と Dynamic Partition Elimination実行プラン

結合時に、結合先に合致するPartitionだけ検索する

 

crmprogrammer38.hatenablog.com

 

  • 上記で書いたようなパーティションを指定したテーブルと他のマスタテーブルを内部結合する
  • 結合条件がパーティションを指定した項目である
  • 結合するテーブルの関係は1:Nの関係が物理的に保証されている
  • マスタテーブルに検索条件を指定する
  • 統計情報が正しく取れている

 

以上を満たすと(あくまでバージョン13のTERADATAで開発した経験値です。)dynamic partition eliminationという実行プランが選択されます。
結合するテーブルの関係は1:Nの関係が物理的に保証されている というのは、結合するマスタテーブル側の結合する項目にユニークの指定があることを意味しています。ユニークの指定は、unique primary index もしくは、 unique secandary indexで定義することになります。

このプランが選択されると、テーブルデータの該当するパーティションのみ読み込まれるため、フルスキャンさせたくない場合とても有効です。

パーティションは1から65536までで区切るため、データのカーディナリティが65536以内のマスタとの結合項目が候補となります。
そうすると、1年365日分のレコードとなるカレンダーマスタとの結合項目が相性がいいことがわかります。1年分のデータを検索すると、カレンダーマスタでは365件しかヒットしないので、結合するトランザクションテーブルでは、365個のパーティションのみ検索するようになります。
もちろん、トランザクションテーブルに1年分のデータしか格納されていなければ365個/365個の検索となり意味はありませんが、10年、20年というデータを保持していれば効果があります。また、1月分、1日分というデータの取得範囲を限定すればするほど素早い検索が可能となります。

 

(DWHで良くある結合の図)

f:id:crmprogrammer38:20170131161337p:plain

カレンダーマスタ1に対して、売上ファクトはN

売上ファクトの年月日にパーティションが指定されている。(FKと記載はしていますが、特に外部キーの指定は必要ありません)

2010年度の条件を指定した場合、売上ファクトは、2010/4/1~2011/3/31までのパーティションのみをスキャンする。

 

最後に

DWHでは、時系列にデータが蓄積されていきますが、期間を指定してデータを見ることが多いと思います。その際に指定する日付にパーティションが指定されていると検索結果が素早く帰ってきて分析する人のメリットも大きくなります。
TERADATAでは、secanday index や hash index の効果があまり高くないためパーティションの指定をどこにするかが大きなポイントだと思います。