TERADATAは、データを分散している
TERADATAは、データを分散させて管理していて、Primary Indexに指定したカラムを元に分散させている。分散された1つはAMPと呼ばれ、1つのDBに複数AMPがある状態となります。(詳細は企業のサイトにあると思います)
データは分散されているため、あるテーブルとあるテーブルを結合しようとするとAMP間でデータの移動させて結合を行っています。
例えば、1000件の商品マスタと、10億件の売上データの結合では、1000件の商品マスタを全AMPにコピーして、そのAMP内で結合するようにプランを立てています。
マスタという名の巨大なテーブルがあった場合、そのマスタに関連するトランザクションと結合する際にデータの移動でとても時間がかかる場合があります。
例えば、5千万件の顧客マスタがあって、その顧客の取引履歴データが10億件ある場合で、顧客コードで顧客マスタと取引履歴データを結合する必要があったとします。
顧客マスタはUPIで顧客コードが指定されていて、取引履歴データはPIで取引番号が指定されていた場合、TERADATAは結合できるようにAMP間でデータの再配置を実施してから結合する。仮に全AMPに顧客マスタを配置したとするとこれは時間がかかります(※1)
Primary Indexが同じだと再配置無しで結合できる
顧客マスタはUPIで顧客コードが指定されていて、取引履歴データはPIで顧客コードが指定されていた場合、結合したいデータは最初から同じAMPに配置された状態です。再配置無しで結合できるので、早くなります。(merge join というプランのようです)
もちろん、取引履歴データのPIを顧客コードにしても、大きく偏らないことが前提とはなります。(ちょっとぐらい偏るのは気にしなくて大丈夫です。)
補足ですが、結合を早くしたくてPrimary Indexを揃える場合は、等号で結合するカラムをPI(もしくはUPI)に指定します。
マスタで有効開始と有効終了の日付があって、次のような結合になる場合でも、PIにするのは顧客コードです(等号で結合する項目なので)
select ・・・ from 取引履歴データ inner join 顧客マスタ
on 取引履歴データ.顧客コード = 顧客マスタ.顧客コード
and 取引履歴データ.取引日付 between 顧客マスタ.有効開始日 and 有効終了日
※1 経験はないのですが、TERADATAのノード数が多ければ遅くならないかもしれません。10ノードのシステムとかさわってみたいものです。