17.00 - 17.05 - 問合わせのアクセス パスでの固有結合インデックスの使用 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLリクエストおよびトランザクション処理

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
ユーザー ガイド
Publication ID
B035-1142-170K-JPN
Language
日本語 (日本)

複数の固有結合インデックスが単一テーブルで定義されている場合、最適化ルーチンはそれらのいずれかをアクセス パスに使用できます。単一テーブルで定義されている固有結合インデックスは、そのコストに基づいたアクセス パス選択に対して互いに競合し、アクセス パスとして使用されるときに最もコストが低いと判断されたインデックスがアクセス パス プランナーによって問合わせ計画に対して選択されます。

(ユーザー定義またはシステム定義のどちらの場合でも)固有結合インデックスのプライマリ インデックスでは、必ず統計を収集する必要があります。これにより最適化ルーチンはこれらの統計を使用して、特定の固有結合インデックスを使用した場合のコストをかなり正確に見積もることができます。

最適化ルーチンは、固有結合インデックスのカーディナリティを使用して問合わせで指定される基本テーブルの述部を照合できます。その方法を使用して行なわれるカーディナリティの見積もりは高い信頼度で報告されます(EXPLAINの信頼度レベルおよび結合インデックス統計を使用した単一テーブルの式のカーディナリティの見積もりを参照)。

固有結合インデックスの部分集合およびアクセス パス選択

最適化ルーチンは、問合わせが固有結合インデックスのプライマリ インデックスとして定義されている列で等価条件を指定する場合、USIなどの固有結合インデックスを2-AMP計画での単一行アクセス用のアクセス パスとして使用できます。等価条件の値は、固有結合インデックスにアクセスするためのプライマリ インデックス キーを形成します。

ユーザー定義の固有結合インデックスの場合のように、プライマリ インデックスが固有として明示的に定義される固有結合インデックスの場合、結合インデックスのプライマリ インデックス列セットでのカバレッジ分析テストおよび等価条件の存在は、結合インデックスが最大1行を返すことを保証します。したがって、これらは単一行アクセスに使用される結合インデックスに十分適格となります。

システム定義の固有結合インデックスの場合、カバレッジ分析テストは、結合インデックスが定義されているVALIDTIME条件とTRANSACTIONTIME条件、および問合わせ内のVALIDTIME条件とTRANSACTIONTIME条件に基づきます。Teradata Databaseは、VALIDTIME条件とTRANSACTIONTIME条件を、1つ以上のテンポラル修飾子を指定する問合わせに追加します。

問合わせでさらにVALIDTIME条件とTRANSACTIONTIME条件を指定して、結果セットをさらに制限することもできます。問合わせで見つかったすべてのVALIDTIME条件とTRANSACTIONTIME条件がカバレッジ分析テストに使用されます。

あるユーザー定義の固有結合インデックスが別の固有結合インデックスの部分集合で、両方がリクエストのアクセス パスの選択に対して競合状態にある場合、最適化ルーチンは、より小さなキーでハッシュできるので、列の少ないインデックスを選択します。

例えば、t1に以下の2つの固有結合インデックスを作成するとします。

CREATE JOIN INDEX t1_ji1 AS
SELECT a1, ROWID
FROM t1
UNIQUE PRIMARY INDEX (a1);
CREATE JOIN INDEX t1_ji2 AS
SELECT a1, b1, ROWID
FROM t1
UNIQUE PRIMARY INDEX (a1,b1);

次に、t1に対して以下のSELECTリクエストを実行依頼します。

SELECT c1
FROM t1
WHERE a1=10
AND   b1= 5;

t1_ji1t2_ji2の両方をこのリクエストのアクセス パスとして使用できますが、最適化ルーチンは列数が少ないためt1_ji1を選択します。

ただし、システム定義の結合インデックスの場合、最適化ルーチンは、最も少ない列という経験則を使用できません。プライマリ インデックスの同じ値に対して、結合インデックスに複数の行がある可能性があり、最適化ルーチンは、値あたりの行数やテーブルのサイズを含め、全体的なコストを考慮する必要があるためです。

2つのAMP問合わせ計画でのアクセス パスとしての固有結合インデックス

非圧縮と非値順の両方の単一テーブル結合インデックスを固有プライマリ インデックスで定義できます。

固有結合インデックスの有効な形式を次に示します。
  • ユーザー定義の固有結合インデックス。WHERE句で定義される非圧縮の単一テーブル結合インデックスで、選択リストに基本テーブルのROWIDを含み、固有プライマリ インデックスで定義されます。さらに、固有結合インデックスは問合わせをカバーします。

    この場合、カバレッジは、固有結合インデックスのWHERE句が、同じテーブルに対する問合わせのWHERE句によって修飾される行セットの上位集合である行セットを修飾することを意味します。

  • システム定義の固有結合インデックス。テンポラルUNIQUE制約を強制するために使用されるシステム定義の非圧縮単一テーブル結合インデックスで、システム定義の結合インデックスは問合わせをカバーします。

    この場合、カバレッジは、テーブルの問合わせがテンポラル修飾子を使用して実行される追加要件を含むWHERE句カバレッジも表わします。テンポラル テーブルについては、<Teradata Vantage™ - ANSIテンポラル テーブル サポート、B035-1186>および<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照してください。

固有結合インデックスは、問合わせが固有結合インデックスのUPIとして定義されている列で等価条件を指定する場合、2-AMP計画での単一行アクセス用のアクセス パスとしてUSIのように使用できます。等価条件の値は、固有結合インデックスにアクセスするためのプライマリ インデックス キーを形成します。

ユーザー定義の固有結合インデックスの場合のように、プライマリ インデックスが固有として明示的に定義される固有結合インデックスの場合、結合インデックスのプライマリ インデックス列セットでのカバレッジ分析テストおよび等価条件の存在は、結合インデックスが最大1行を返すことを保証します。したがって、これらは単一行アクセスに使用される結合インデックスに十分適格となります。

システム定義の固有結合インデックスの場合、カバレッジ分析テストは、結合インデックスを定義するVALIDTIME条件とTRANSACTIONTIME条件、および問合わせ内のVALIDTIME条件とTRANSACTIONTIME条件に基づきます。これらの用語の定義と使用については、<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照してください。

Vantageは、VALIDTIME条件とTRANSACTIONTIME条件を、テンポラル修飾子を指定する問合わせに追加します(詳細については、<Teradata Vantage™ - テンポラル テーブル サポート、B035-1182>を参照)。問合わせでさらにVALIDTIME条件とTRANSACTIONTIME条件を指定して、結果セットをさらに制限することもできます。

最適化ルーチンは、問合わせに指定されたすべてのVALIDTIME条件とTRANSACTIONTIME条件をカバレッジ分析テストに使用します。

例えば、次のように定義されるTransaction Timeテーブルpart_typesのTRANSACTIONTIMEディメンションで定義されるCURRENT UNIQUE制約の場合、

CREATE MULTISET TABLE part_types (
  part_id       INTEGER NOT NULL,
  part_name     VARCHAR(20),
  part_type     CHARACTER(2)
  part_duration PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS
                TRANSACTIONTIME,
  CURRENT TRANSACTIONTIME UNIQUE (part_id))
  PRIMARY INDEX (part_name);

Vantageは、part_typesのシステム定義の結合インデックスを次のように定義します。

CREATE SYSTEM_DEFINED JOIN INDEX  part_types_TJI004 AS
  CURRENT TRANSACTIONTIME SELECT ROWID, part_id, part_duration
  FROM part_types
UNIQUE PRIMARY INDEX (part_id);

最適化ルーチンは、AS OF CURRENT_DATE修飾子を使用して同じテーブルを問合わせるリクエストに以下の条件を追加します。

BEGIN (part_id)<=CURRENT_DATE AND
END   (part_id)> CURRENT_DATE

システム定義の結合インデックスには、結合インデックスに格納されるOpen行のみを修飾するTRANSACTIONTIME条件があるため、インデックスはAS OF問合わせをデフォルトでカバーできません。ただし、AS OF問合わせがOpen行を修飾するためのTRANSACTIONTIME条件を明示的に指定する場合、結合インデックスは問合わせをカバーできます。

システム定義の結合インデックスがTransaction Timeディメンションのみで固有制約を強制するために使用される場合、システム定義の結合インデックスのプライマリ インデックス列セットの等価条件は、結合インデックスが最大1行を返すことを十分保証します。

ただし、システム定義の結合インデックスがValid Timeディメンションで固有性制約を強制するために使用される場合、インデックスには、validtime_columnが重複しない限り、column_listに同じ値を持つ複数の行が含まれる可能性があります。これは、Valid Timeディメンションでの固有制約を持つcolumn_listに対する等価条件が、テーブルの問合わせがValid Timeディメンション内の単一のポイントに対して実行される場合にのみ、最大で1行を返します。つまり、表は一時的な修飾子CURRENTまたはAS OFによって問合わせが実行されます。

最適化ルーチンがCURRENTまたはAS OF修飾子に関して問合わせに追加する条件もまた、その時点に対応する行を修飾するには、システム定義の結合インデックスでの残余条件として評価される必要があります。さらに、修飾された行に対して複数の行パーティションを検索する必要がなくなるように、システム定義の結合インデックスがパーティション プライマリ インデックスを持たないようにします。

このため、Valid Timeディメンションで固有性制約を強制するシステム定義の結合インデックスを単一行アクセスで使用できるようにするためには、以下の条件が満たされる必要があります。
  • システム定義の結合インデックスはPPIを使って定義してはなりません。
  • システム定義の結合インデックスは、カバレッジ分析テストに合格する必要があります。
  • 問合わせは、テーブルでテンポラル修飾子CURRENTまたはAS OFを指定する必要があります。
  • 問合わせは、結合インデックスのプライマリ インデックスとして定義される列で等価条件を指定する必要があります。

次のテーブルに、カバレッジ分析テストに合格し、クエリーで結合インデックスのプライマリ インデックス列セットに等価条件が指定されていることを条件として、システム定義の結合インデックスがアクセス パスでの使用に適している場合をまとめます。

DML修飾子 テンポラル制約時間 制約タイプ システム定義の固有結合インデックスは問合わせ アクセス パスでの使用に適するか?
CURRENT VALIDTIME CURRENT UNIQUE はい
SEQUENCED UNIQUE はい
TRANSACTIONTIME CURRENT UNIQUE はい
AS OF date_expression | timestamp_expression VALIDTIME CURRENT UNIQUE はい。date_expression | timestamp_expression >= 単一テーブルの固有結合インデックスのDATE、CURRENT_DATE、またはCURRENT_TIMESTAMPの解釈された値の場合。
SEQUENCED UNIQUE はい
TRANSACTIONTIME CURRENT UNIQUE はい。問合わせのTRANSACTIONTIMEがUNTIL_CLOSEDの場合
SEQUENCED [period_of_applicability] VALIDTIME CURRENT UNIQUE いいえ
SEQUENCED UNIQUE いいえ
TRANSACTIONTIME CURRENT UNIQUE はい。問合わせのTRANSACTIONTIMEがUNTIL_CLOSEDの場合
アクセス パスとしての固有結合インデックスの使用はプライマリ インデックス列に等価条件がある問合わせに限定され、2-AMPステップは修飾された行IDの基本テーブルの読み取りを必要とするため、カバー結合インデックスと同じ結合インデックスを使用することで、より最適な計画を見つけることができます。クエリー リライト サブシステムもクエリー リライトの通常結合インデックスとして固有結合インデックスを使用することができます。つまり、固有結合インデックスは、問合わせの最適化において二重のロールを果たすことができます。
  • 通常結合インデックスとして、および問合わせを書き換えるための部分的なカバー結合インデックスまたは完全なカバー結合インデックスとして、使用できます。
  • 問合わせが固有結合インデックスを使用するように書き換えられない場合、固有結合インデックスはアクセス パス プランナーによって固有インデックスとして扱うことができます。

    最適化ルーチンは、結合インデックスのプライマリ インデックスに対応する基本テーブル列に等価条件がある場合、固有結合インデックスをアクセス パスとして使用できます。

次の例について考えてみます。

CREATE TABLE t1 (
  a1 INTEGER,
  b1 INTEGER,
  c1 INTEGER);
CREATE JOIN INDEX uji AS
  SELECT b1, c1, ROWID
  FROM t1
  WHERE c1 BETWEEN 200 AND 1000
UNIQUE PRIMARY INDEX (b1);

t1に対して以下のSELECTリクエストを実行依頼するとします。

SELECT b1,c1
FROM t1
WHERE b1=10
AND   c1=500;
最適化ルーチンは、このSELECTリクエストに対して次の計画を評価します。
  • ujiから単一AMP取得を行なう計画。

    この計画は、リクエスト内のt1ujiで置き換える結合インデックスの書き換えから生じます。

  • uji

    この計画は、アクセス パスとしてのujiの使用から生じます。

    から2-AMP取得を行なう計画。

常に当てはまるように、最適化ルーチンは、より低いコストの計画を選択します。