読者です 読者をやめる 読者になる 読者になる

【TERADATA】 大きいテーブル同士を結合する時に結合条件のカラムがそれぞれPrimary Indexだと結合処理が早い

TERADATA

TERADATAは、データを分散させて管理していて、Primary Indexに指定したカラムを元に分散させている。分散された1つはAMPと呼ばれ、1つのDBに複数AMPがある状態となる。(詳細は企業のサイトにあると思います)

 

データは分散されているため、あるテーブルとあるテーブルを結合しようとするとAMP間でデータの移動が発生する。

例えば、1000件の商品マスタと、10億件の売上データの結合では、1000件の商品マスタを全AMPにコピーして、そのAMP内で結合するようにプランを立てる。

 

でも世の中には、マスタという名はついてるものの巨大なテーブルが存在して、さらにそのマスタに関連するトランザクションがある場合に、データの移動にとても時間がかかる場合がある。

 

5千万件の顧客マスタがあって、その顧客の取引履歴データが10億件ある場合がそれにあたり、顧客コードで顧客マスタと取引履歴データを結合する必要があったとする。

 

顧客マスタはUPIで顧客コードが指定されていて、取引履歴データはPIで取引番号が指定されていた場合、なんとか結合しないといけないので、正しく結合できるようにAMP間でデータの再配置を実施してから結合する。これは遅い(※1)

 

しかし、顧客マスタはUPIで顧客コードが指定されていて、取引履歴データはPIで顧客コードが指定されていた場合、結合したいデータは最初からAMPに配置された状態からスタートできてそのまま結合できる。これは早い(merge join というプランのようです)

もちろん、取引履歴データのPIを顧客コードにしても、偏りなく分散できることが前提とはなります。(ちょっとぐらい偏るのは気にしなくていいかも)

 

補足ですが、結合を早くしたくてPrimary Indexを揃える場合は、等号で結合するカラムをPI(もしくはUPI)に指定します。

マスタで有効開始と有効終了の日付があって(SCDのタイプどれか)、次のような結合になる場合でも、PIにするのは顧客コードです(等号で結合する項目なので)

select  ・・・ from  取引履歴データ inner join 顧客マスタ

on    取引履歴データ.顧客コード = 顧客マスタ.顧客コード

and  取引履歴データ.取引日付 between 顧客マスタ.有効開始日 and 有効終了日

 

※1 自分の経験はないですが、取引履歴が10億件などあるのであれば、そもそもTERADATA自体に余裕があるかもしれなくて(ノード数が10とか)そうすると遅くないのかもしれないですね。そういったシステム開発に携わってみたいなー。