前回からの振り返り
前回はVantageCloud Enterpriseの運用について記載しましたので
今回はデータベース設計について記載します。
※前回の記事:https://qiita.com/NTTD-niwats/items/1188772d1e4ae59235b8
今回のテーマ
今回はデータベース設計における留意事項について整理します。
テーブル/インデックス設計
1. テーブル設計
Primaryキーの列の重複を許可する: Create MULTISET table テーブル名;
Primaryキーの列の重複を許可しない:Create SET table テーブル名;
以上の2種類があります。
基本的に重複を許容するMULTISETの方がデータロードが速く、推奨はMULTISETのようです。
ただ、一般的なデータベースのPrimaryキーはユニークキーとして扱うため、重複を許容することで思わぬ問題が発生する可能性がありますので、アプリの設計時に考慮できていることを確認してください。
MULTISET、SETを省略してテーブルを作成できますが、TeradataStudioを利用する場合には注意が必要です。
TeradataStudioからデータベースに接続する場合に接続パラメータの設定があります。
JDBC Connection `ropertiesにTMODEパラメータがあり、ANSIとTERAの2種類があります。(デフォルトがANSI)
ANSI:Create文にSET、MULTISET句を記載せずに作成した場合には MULTISET
TERA:Create文にSET、MULTISET句を記載せずに作成した場合には SET
※ちなみにBTEQの場合はTERAです。
2. インデックス設計(データの偏り)
Teradataは Primaryキーを基にデータをHASH値変換し、各AMPに分割配置します。
そのため、Primaryキーが非常に重要になります。
例えば性能試験を行うために大量のデータを準備するときにPrimaryキーが同じ値のレコードを大量にデータロードすると1つの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つのテーブルに複数の統計情報があり、統計情報取得のクエリが大量にある場合には
以下にクエリを実行することでテーブル内にある統計情報を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. コミュニティを利用
技術的な質問をしたい場合にはサポートポータルを利用するのもよいですが
コミュニティサイトから投稿するとサポートポータルよりも早く回答してくれる場合がありますので活用してみてください。
感想
構築を開始してから運用するまで多くの課題に直面しましたがなんとか運用できました。
Teradata社のクラウド-DIY版は5~6年前にリリースされましたが、今回構築したSaaS版は2~3年前と日が浅く、新たな機能の実装が優先されマニュアルの整備が追い付いていない状況なので
私と同じ課題にぶつからないように少しでも役に立てていただけたらと思います。
最後に課題もありますが、本Teradata製品はデータウェアハウスとしてはよくできた製品だと思いますので、少しでも興味を持っていただける方が増えることを願っています。
仲間募集
NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。