Teradata-パーティション化されたプライマリインデックス
パーティションプライマリインデックス(PPI)は、特定のクエリのパフォーマンスを向上させるのに役立つインデックスメカニズムです。行がテーブルに挿入されると、それらはAMPに格納され、行ハッシュの順序で配置されます。テーブルがPPIで定義されている場合、行はパーティション番号でソートされます。各パーティション内では、行ハッシュによって配置されます。行は、定義されたパーティション式に基づいてパーティションに割り当てられます。
利点
特定のクエリの全表スキャンは避けてください。
追加の物理構造と追加のI / Oメンテナンスを必要とするセカンダリインデックスの使用は避けてください。
大きなテーブルのサブセットにすばやくアクセスします。
古いデータをすばやく削除し、新しいデータを追加します。
例
OrderNoにプライマリインデックスがある次のOrdersテーブルについて考えてみます。
店番号 | 注文番号 | 注文日 | OrderTotal |
---|---|---|---|
101 | 7501 | 2015-10-01 | 900 |
101 | 7502 | 2015-10-02 | 1,200 |
102 | 7503 | 2015-10-02 | 3,000 |
102 | 7504 | 2015-10-03 | 2,454 |
101 | 7505 | 2015-10-03 | 1201 |
103 | 7506 | 2015-10-04 | 2,454 |
101 | 7507 | 2015-10-05 | 1201 |
101 | 7508 | 2015-10-05 | 1201 |
次の表に示すように、レコードがAMP間で分散されていると想定します。記録されたものはAMPに保存され、行ハッシュに基づいてソートされます。
RowHash | 注文番号 | 注文日 |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | 注文番号 | 注文日 |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
クエリを実行して特定の日付の注文を抽出すると、オプティマイザは全表スキャンの使用を選択し、AMP内のすべてのレコードにアクセスできます。これを回避するために、注文日をパーティション化されたプライマリインデックスとして定義できます。行が注文テーブルに挿入されると、注文日で分割されます。各パーティション内では、行ハッシュ順に並べられます。
次のデータは、レコードが注文日で分割されている場合に、レコードがAMPにどのように保存されるかを示しています。注文日までにレコードにアクセスするためにクエリが実行されると、その特定の注文のレコードを含むパーティションのみがアクセスされます。
パーティション | RowHash | 注文番号 | 注文日 |
---|---|---|---|
0 | 3 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
パーティション | RowHash | 注文番号 | 注文日 |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 3 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
以下は、パーティションプライマリインデックスを使用してテーブルを作成する例です。PARTITION BY句は、パーティションを定義するために使用されます。
CREATE SET TABLE Orders (
StoreNo SMALLINT,
OrderNo INTEGER,
OrderDate DATE FORMAT 'YYYY-MM-DD',
OrderTotal INTEGER
)
PRIMARY INDEX(OrderNo)
PARTITION BY RANGE_N (
OrderDate BETWEEN DATE '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);
上記の例では、テーブルはOrderDate列でパーティション化されています。毎日1つの個別のパーティションがあります。