結合インデックス、式、および組み込み関数 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
ft:locale
ja-JP
ft:lastEdition
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage

パーティション式でDATE、CURRENT_DATE、またはCURRENT_TIMESTAMPの組み込み関数を指定した結合インデックスを作成する場合、Teradata Databaseはデフォルト動作として、クエリー計画を作成するために最適化ルーチンが結合インデックスを使用する時点で動的に関数を評価するのではなく、結合インデックスの作成時に関数を解決し、その結果をインデックス定義の一部として格納します。結合インデックスのパーティション式の一部として指定されたCURRENT_TIMEまたはTIME関数を、ALTER TABLE TO CURRENTリクエストを使用して調整することはできません

ただし、パーティション式の一部として指定されたDATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数の値は、ALTER TABLE TO CURRENT文を使用して調整できる(ALTER TABLE TO CURRENTを参照)ので、必ずしも調整できないわけではありません。パーティション式でこのように使用されるDateTime式を、更新可能日付または更新可能タイムスタンプといいます。

組み込み(システム)関数をWHERE句で指定する結合インデックスを作成する場合、Teradata Databaseは、クエリー計画を作成するために最適化ルーチンがインデックスを使用する時点で動的に関数を評価するのではなく、結合インデックスの作成時に関数を解決し、その結果をインデックス定義の一部として格納します。組み込み関数の詳細については、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。

ALTER TABLE TO CURRENTリクエストを使用して、結合インデックス定義のWHERE句で指定されたDATE、CURRENT_DATE、またはCURRENT_TIMESTAMP関数を調整することができます。インデックス定義に格納されている解決された値と一致する明示的な値をクエリーがそのWHERE句で指定した場合、最適化ルーチンは結合インデックスを使用します。

このことに関連のある組み込み関数は、以下のとおりです。
  • ACCOUNT
  • DATABASE
  • PROFILE
  • ROLE
  • SESSION
  • TIME
  • USER

たとえば、2007年1月4日に対してCURRENT_DATE組み込み関数を使用して結合インデックスを定義するとします。

    CREATE JOIN INDEX curr_date AS
      SELECT *
      FROM orders
      WHERE order_date >= CURRENT_DATE;

2007年1月7日に次のSELECTリクエストを実行します。

    SELECT *
    FROM orders
    WHERE order_date >= CURRENT_DATE;

インデックス定義に格納されている日付は現行のシステム日付'2007-01-07'ではなく明示的な値'2007-01-04'なので、最適化ルーチンはこのクエリーをEXPLAINする際に結合インデックスcurr_dateを使用しません。

一方、2007年1月7日またはその他の日付に対して次のSELECTリクエストを実行する場合、最適化ルーチンはクエリー計画に対して結合インデックスcurr_dateを使用does。なぜなら、その作成時に結合インデックス定義よって格納されたのと同じ日付が文の中で明示的に指定されているからです。

    SELECT *
    FROM orders
    WHERE order_date = DATE '2007-01-04';

PERIOD列およびUDT列に、集約結合インデックスを含めて結合インデックスを定義できます。ただし、UDT列に関する統計を収集することはできません。また、インデックス定義のWHERE句およびON句で単一テーブル条件を指定する結合インデックスだけでなく、選択リストで非集約、非OLAP、および非UDFの他の式を指定する結合インデックスも定義できます。この一環として、UDT列と関連する方式を使用して結合インデックスを定義することもできます。

以下の一連のルールは、PERIODデータ型およびUDTデータ型の式と列を結合インデックス定義で指定する場合の制限と制約を定義したものです。
  • 結合インデックス定義の選択リストで指定する式は、少なくとも1つの列に対して定義されていなければなりません。

    選択リストで定数式を指定することはできません。

    例えば、次のリクエストは、選択リストで定数CASE式を指定しているため、無効です。

         CREATE JOIN INDEX test AS
          SELECT a1, CASE WHEN 1=1
                          THEN 1
                          ELSE 0
                     END AS c
          FROM t1;
  • 結合インデックス定義の選択リストで指定された式は、単一テーブルまたは複数テーブルの列セットを参照できます。

    Teradata Databaseは、複数列式から成るWHERE句条件を結合条件として扱いません。

    複数テーブル結合インデックスを作成している場合、各テーブルからの列の等価条件でテーブルを結合する必要があります。そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。

    例えば、次のリクエストは無効です。同じタイプのさまざまなテーブルの列間の少なくとも1つの等価結合に定数条件または不等条件がAND演算されている実現可能条件のみが、WHERE句で有効だからです。

         CREATE JOIN INDEX test AS
          SELECT *
          FROM t1,t2
          WHERE a1+b1=a2;
  • 結合インデックス定義の選択リストで指定した式は別名化する必要があります。

    例えば、次のリクエストは、式BEGIN(d1)に別名が使用されていないため、無効です。

         CREATE JOIN INDEX test AS
          SELECT a1, BEGIN(d1)
          FROM t1;
  • 集約結合インデックス定義の選択リストで定義された式は、GROUP BY句の一部として指定する必要もあります。

    例えば次のリクエストは、集約式SUM(c1) ASを含んだGROUP BY句を指定していないため、無効です。

         CREATE JOIN INDEX test AS
          SELECT (a1+b1) AS a, SUM(c1) AS s
          FROM t1;
  • UDT列の結合インデックスには、プライマリ インデックスあるいはセカンダリ インデックスを定義できます。例えば、列t1.d1のデータ型がUDTであるとします。

    以下のCREATE JOIN INDEXリクエストは有効です。そのプライマリ インデックスが列t1.d1に定義されているからです。

         CREATE JOIN INDEX test AS
          SELECT d1, a1
          FROM t1
          PRIMARY INDEX (d1);
  • UDT列を指定する圧縮結合インデックスを定義することができます。

    例えば、列t1.d1のデータ型がUDTであるとします。以下のCREATE JOIN INDEXリクエストが有効です。

         CREATE JOIN INDEX test AS
          SELECT (b1), (c1,d1)
          FROM t1;

結合インデックス定義の選択リストでUDTデータ型列およびPERIODデータ型列、BEGIN式、およびP_INTERSECT式を正しく指定する方法の例については、<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「CREATE JOIN INDEX」を参照してください。