プログラマ38の日記

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

TERADATA: カラム単位の文字コード指定

文字列型に適切な文字コードを指定しよう

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項目のみを持たせ、データサイズを小さくします。

f:id:crmprogrammer38:20170910201843p:plain

上記のようにマスタテーブルに、結合キーと同じ値で、文字コード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で定義する場合もあります。