ホーム > ライブラリー > Teradata コラム > Teradataデータベースアーキテクチャ概説(4)

丹 隆之
製品企画開発部
Teradataデータベースはリレーショナル・データベースであり、その実体は 2次元で表される “テーブル”
の集合です。それぞれのテーブルは、複数の “行” と “カラム” で構成されます。例えば、「従業員テーブル」には、社員ID、氏名、入社年月日、性別、といった従業員の属性を示すカラムがあり、個々の社員を表すデータが行という実体として存在します。連載の第1回で述べたとおり、Teradata
はハッシュ分散という方式でテーブルを行単位に分割し、仮想ディスクである各AMP(*1) に格納します。それでは、Teradata
は何をキーにして行を分散するのでしょうか?その答えがプライマリ・インデックス(PI)です。
今回は、Teradata の優れたパフォーマンスの要となる PI と、PI の機能を拡張したパーティション・プライマリ・インデックス(PPI)について解説します。
Teradata の全てのテーブルは、1つ以上のカラムから構成される PI を必ず 1つ含んでいます。PIカラムの実体は、ユニークであってもノンユニークであっても構いません。例えば、前述の「従業員テーブル」において、値が全て異なる “社員ID” カラムを PI に指定すると、ユニーク・プライマリ・インデックス(UPI)が作成され、値が 2種類しかない “性別” カラムを PI に指定すると、ノンユニーク・プライマリ・インデックス(NUPI)が作成されます。
![図1 [従業員テーブル]](../images/col_05d-fi001.gif)
どのカラムを PI として選択してもテーブルの作成は可能で、データもきちんと格納することができます。ところが、PI
の選択の仕方によって、その後のパフォーマンスや運用に大きな差が生じます。
先ほど、テーブル内の各行は PI をキーにして各AMP に分散される、と述べました。Teradata
はデータを格納する際、PI の値を独自のハッシュ関数に渡し、ハッシュ値という数値を算出します。そして、求められたハッシュ値によって、行をどの
AMP に格納するかを決定します。従って、PI の値が同じだと求められるハッシュ値も同じになるため、格納先も同じになります。性別カラムを
PI にすると、同じ性別の人のデータは常に同じ AMP に格納されるため、たとえ AMP が 100個あるシステムでもその中の
2つしか使われないことになります。一方で、社員IDを PI にすれば、求められるハッシュ値は異なるため、データは各AMP
に均等に分散されます。
![図2 [従業員テーブル]](../images/col_05d-fi002.gif)
PI をどのカラムに設定すべきかは、以下の 3つの観点から慎重に検討する必要があります。
データアクセスのパフォーマンスをいかに上げるかは、I/O をいかに減らすかにかかっています。その意味で、PI によるデータアクセスは単一AMP操作になるため、もっともパフォーマンスの良いアクセス方法になります。それぞれのテーブルで、アクセス条件として最も頻繁に使用されるカラムが PI の有力な候補になります。
PI の値がノンユニークのとき、その固有性に極端な偏りがある(例えば、“勤務先” カラムの 95%が本社で 5%が他の営業所である)場合や、固有性が低い(“性別” カラムには M か F の 2種類の値しかない)場合は、パフォーマンスやディスクスペースの使用効率に影響が生じます。
PI の値が変更されるとハッシュ値も変わってしまうため、該当データを別の AMP に再度格納し直すという作業が Teradata の内部で発生してしまいます。従って、なるべく値が一定していて変更が少ないカラムを PI に選択することが望ましいと言えます。
以上のことを考慮して適切な PIカラムを選択することで、Teradata の最高のパフォーマンスを保つことができます。
Teradata V2R5.0 から、テーブルにパーティションを設定する PPI という機能が取り入れられています。PPI を使用しても、PI の値をキーにして各行がそれぞれの AMP に分散されることに変わりありませんが、各AMP内のデータは PPI で指定したパーティション順にソートされます。
![図3 [通常のテーブル]と[PPIを定義したテーブル]](../images/col_05d-fi003.gif)
例えば月単位でパーティションを設定すれば、ある月に関するデータは特定のパーティションに格納されます。従って、PPIテーブルに対して範囲を限定したクエリーを実行すれば、全件検索ではなく該当するパーティションのみがアクセスされるため、パフォーマンスが格段に向上します。
PPI は主に以下のメリットをもたらします。
・範囲指定のあるクエリーのパフォーマンスが大幅に向上
・“古い” データを瞬時に削除し、“新規” データを容易に追加できる
・PPI を利用する際に、クエリーやアプリケーション側の変更は不要
オプティマイザー(*2) は、PPI の定義とクエリーの条件に基づいて、読み取りをスキップするパーティションのリストを作成します。これをパーティション・エリミネーション(パーティションの除外)と言い、PPI
によるクエリーのパフォーマンス向上は、どれだけ多くのパーティションが除外されるかに依存します。
ただし、PPI は使用すれば必ずパフォーマンスが向上するというものではなく、乱用するとかえってパフォーマンスが悪化するケースもありますので注意が必要です。実際の導入に際しては総合的に効果を測定し、トレードオフを十分に評価してください。
Teradataデータベースには、検索パフォーマンスを向上させるためのさまざまな機能が備わっています。しかしながら、それらのどの機能よりも PI によるアクセスが最も優れたパフォーマンスを発揮します。それだけに、どのカラムを PI にするかは、さまざまな要素を検討して決定すべきです。また、PPI を適切に利用することで飛躍的にパフォーマンスを改善する可能性もあります。Teradata の特徴や機能を理解して実装することで、Teradata の価値を最大限に引き出してください。
*1: AMP は Teradata に接続されているディスク・サブシステムを管理するプロセスです。各AMP は、物理ディスク領域の一部分を管理し、その領域内にテーブルの一部分が格納されます。
*2: オプティマイザーとは、SQL文と統計情報を解析して、要求されたデータに対する最も効率的なアクセス経路を構築する Teradata の最適化ルーチンです。
Copyright (C) Teradata Magazine - Vol.9 2005