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に保存され、行ハッシュに基づいてソートされます。

AMP 1

RowHash 注文番号 注文日
1 7505 2015-10-03
2 7504 2015-10-03
3 7501 2015-10-01
4 7508 2015-10-05

AMP 2

RowHash 注文番号 注文日
1 7507 2015-10-05
2 7502 2015-10-02
3 7506 2015-10-04
4 7503 2015-10-02

クエリを実行して特定の日付の注文を抽出すると、オプティマイザは全表スキャンの使用を選択し、AMP内のすべてのレコードにアクセスできます。これを回避するために、注文日をパーティション化されたプライマリインデックスとして定義できます。行が注文テーブルに挿入されると、注文日で分割されます。各パーティション内では、行ハッシュ順に並べられます。

次のデータは、レコードが注文日で分割されている場合に、レコードがAMPにどのように保存されるかを示しています。注文日までにレコードにアクセスするためにクエリが実行されると、その特定の注文のレコードを含むパーティションのみがアクセスされます。

AMP 1

パーティション 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

AMP 2

パーティション 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つの個別のパーティションがあります。