プログラマ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で定義する場合もあります。