1から学ぶ「Teradata」(第4回)- データベース設計-留意事項編

# 前回からの振り返り
前回はVantageCloud Enterpriseの運用について記載しましたので
今回はデータベース設計について記載します。
※前回の記事：https://qiita.com/NTTD-niwats/items/1188772d1e4ae59235b8

# 今回のテーマ
今回はデータベース設計における留意事項について整理します。

## テーブル/インデックス設計
### 1. テーブル設計

Primaryキーの列の重複を許可する: Create MULTISET table テーブル名;
Primaryキーの列の重複を許可しない:Create SET table テーブル名;

以上の２種類があります。

基本的に重複を許容するMULTISETの方がデータロードが速く、推奨はMULTISETのようです。<BR>ただ、一般的なデータベースのPrimaryキーはユニークキーとして扱うため、重複を許容することで思わぬ問題が発生する可能性がありますので、アプリの設計時に考慮できていることを確認してください。

MULTISET、SETを省略してテーブルを作成できますが、TeradataStudioを利用する場合には注意が必要です。
TeradataStudioからデータベースに接続する場合に接続パラメータの設定があります。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695372/9138480a-89c6-2d52-5ae2-9488d55e20bf.png)


JDBC Connection `ropertiesにTMODEパラメータがあり、ANSIとTERAの２種類があります。（デフォルトがANSI）

__ANSI：Create文にSET、MULTISET句を記載せずに作成した場合には MULTISET__
__TERA：Create文にSET、MULTISET句を記載せずに作成した場合には SET__
 
※ちなみにBTEQの場合はTERAです。

### 2. インデックス設計(データの偏り)
Teradataは __Primaryキーを基にデータをHASH値変換し、各AMPに分割配置します。__
そのため、Primaryキーが非常に重要になります。<BR>
例えば性能試験を行うために大量のデータを準備するときにPrimaryキーが同じ値のレコードを大量にデータロードすると１つのAMPにデータが偏り、処理性能問題やデータのロード、登録時に書き込みエラー(「no more room」)が発生することがあります。

※分散配置することで処理性能を向上させているため、データの格納先に偏りがあると当然性能はでません。また分散配置の考え方であるため、全体サイズをAMP数で割った値が、AMP単位の最大サイズとなるため、偏りがあると全体の割り当てサイズに到達する前に一部のAMPの割当容量に到達し、エラーとなります。

データの偏りを調べたい場合には以下のクエリを実行して、一部のレコードのcurrent_permの値が1桁以上のサイズが異なっているのであれば偏りが発生しています。

    select vproc,current_perm,max_perm 
    from dbc.diskspaceV 
    where databasename = 'データベース名 or ユーザ名' 
    and tablename = 'テーブル名' 
    order by vproc,current_perm,max_parm;

※permの単位はバイトですので、ギガで表示した場合には1024/1024/1024で割る必要があります。

 ## 統計情報/アクセスパターン
### 1. 統計情報の収集
性能問題が発生しないようにクエリの検索の条件となるカラムに対しては定期的に統計情報を収集しておくことをお勧めします。

    collect statistics column(列名) on テーブル名;

1つのテーブルに複数の統計情報があり、統計情報取得のクエリが大量にある場合には
以下にクエリを実行することでテーブル内にある統計情報を１つのクエリで実行できますので参考にしていただければと思います。
※統計情報収集用のクエリ形式に加工された結果が返却されます

    select 'COLLECT STATISTICS ON ' || B.DATABASENAME || '.' || TABLENAME || ';' FROM (
       SELECT　DATABASENAME,TABLENAME 
       FROM DBC.STATSV 
       WHERE DATABASENAME <> 'DBC' 
       GROUP BY DATABASENAME,TABLENAME 
    ) B ORDER BY 1;


###  2. アクセスパターンの調査
一部のクエリ処理が非常に重く、原因を特定したい場合にはクエリのアクセスパターンを調査してください。

    Explain 実行クエリ;

上記のクエリの実行結果に「どのような順番でどのような処理」を実行しているか表示されます。
__The estimated time for this step is 〇〇 seconds.__ を参照し時間が掛かっている箇所を特定します。
性能問題でよく発生する原因は対象データを特定において該当のAMPにあるデータのみを参照すればよいがすべてのAMP（ALL-AMP)を参照しています。
__検索条件の見直しやJOIN　index(別のDBエンジンのMateriarizedview）を検討してみてください。__


## その他(小ネタ)
#### 1. 英語が苦手の方へ
Teradata社のサイトには日本語している箇所もありますが、日本語対応していても英語の記載が非常に多くあります。そのため、英語が苦手な方はドメインを変更した上で英語版のサイトにアクセスし、Google翻訳することをお勧めします。

以下のようにTeradata社のサイトは英語版がcomドメインであり、日本語対応されているページはドメインがjpに代わっているだけですので、日本語版jpの部分をcomに変更することで英語版サイトが表示されます。

例として以下のサイトを見ていただけるとわかりますが記載内容は同じですので
英語版のcomドメインを参照の上、翻訳することで日本語対応できます。

    https://www.teradata.jp/platform/ai-ml　
    →https://www.teradata.com/platform/ai-ml　

#### 2. コミュニティを利用
技術的な質問をしたい場合にはサポートポータルを利用するのもよいですが
コミュニティサイトから投稿するとサポートポータルよりも早く回答してくれる場合がありますので活用してみてください。

https://support.teradata.com/community

##    感想
構築を開始してから運用するまで多くの課題に直面しましたがなんとか運用できました。

Teradata社のクラウド-DIY版は5～6年前にリリースされましたが、今回構築したSaaS版は2～3年前と日が浅く、新たな機能の実装が優先されマニュアルの整備が追い付いていない状況なので
私と同じ課題にぶつからないように少しでも役に立てていただけたらと思います。

最後に課題もありますが、本Teradata製品はデータウェアハウスとしてはよくできた製品だと思いますので、少しでも興味を持っていただける方が増えることを願っています。

# 仲間募集
NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer
</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist
</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804
</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=898
</details>