文字列型に適切な文字コードを指定しよう
TERADATAは、カラム単位に文字コードが指定できます。
CREATE SET TABLE SAMPLE
(
LATINFIELD CHAR(2) CHARACTER SET LATIN CASESPECIFIC NOT NULL
,UNICODEFIELD VARCHAR(9) CHARACTER SET UNICODE CASESPECIFIC
)
UNIQUE PRIMARY INDEX
(
LATINFIELD
);
文字が確実に半角アルファベット・記号・数字なのであればLATINにするとデータサイズが小さくなって、検索、結合のパフォーマンスも良くなります。
半角カナは、LATINで定義した項目には入りません。
ですが、いくつか注意点があって
crmprogrammer38.hatenablog.com
上の記事で書いた通り、UNICODEで定義した項目とLATINで定義した項目を連結して使うと遅くなってしまいますので、マスタテーブルには、結合用のLATIN項目と、文字列連結用のUNICODE項目の両方を持たせるというテクニックがあります。そして、トランザクションテーブルには結合のLATIN項目のみを持たせ、データサイズを小さくします。
上記のようにマスタテーブルに、結合キーと同じ値で、文字コードをUNICODEにした項目を持たせておけば、次のようにSQLで連結しても問題ありません。
[SQL]
select
a."表示用キー(UNICODE) " || a."名称(UNICODE)"
,b"年月日"
,sum(数値項目)
from マスタテーブル a
inner join トランザクションテーブル b
on a.結合キー(LATIN) = b.結合キー(LATIN)
group by
a."表示用キー(UNICODE) "
,a."名称(UNICODE)"
,b."年月日"
これなら、結合はLATIN同士で高速で、文字列の連結はUNICODE同士で遅くならないSQLとなります。
マスタに"表示用キー(UNICODE)"が追加されていて、その分スプール領域を使っているのですが、結合と、連結時のコストに比べると無視できるレベルです。
DWHで結合用の項目を別で持つのは有効なテクニックとなります。今回はナチュラルキー同士で工夫した形ですが、さらに結合キーが数字だけで構成されている場合は、結合項目をintや、decimalで定義する場合もあります。