更新可能現在日付および更新可能タイムスタンプに基づくCASE_Nパーティション式の最適な調整 - 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
次のルールと指針は、ALTER TABLE TO CURRENT文を使用して最適に調整できるCASE_Nパーティション式を指定するときに適用されます。ALTER TABLE TO CURRENTを参照してください。
  • DATE、CURRENT_DATE、またはCURRENT_TIMESTAMPは、CASE_N条件式の片側にのみ指定する必要があります。CASE_Nの指定は、式のLHSまたはRHSのいずれかで最適となる可能性がありますが、両方の側に指定した場合、調整は最適化できません。

    この最適化によって、Teradata Databaseは調整中に一部のパーティションをスキップできます。ただし、条件式の両側にDATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を指定した場合、Teradata Databaseはテーブルのすべての行をスキャンして、調整の必要がある行を見つける必要があります。

  • Teradata Databaseは、DATE値、CURRENT_DATE値、またはCURRENT_TIMESTAMP値が調整された後で、現在のパーティションに行が残っているかどうかを判別できる場合、調整中にパーティションをスキャンしません。
  • CASE_N式でNO CASEを指定し、複数の条件式でDATE関数またはCURRENT_DATE関数を指定するとき、Teradata Databaseは、CURRENT_DATEまたはCURRENT_TIMESTAMPを使用して最初に指定された条件式が連続していない場合にのみ、調整中にNO CASEパーティションをスキャンします。

    DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を使用して1つの条件式のみを指定するとき、Teradata Databaseは、この条件式に対応するパーティションがスキップされた場合にのみ、NO CASEパーティションをスキャンします。

    例えば、次の式は、すべてこの最適化を利用できます。
    • CASE_N (j ≥ CURRENT_DATE, NO CASE)

      この場合、Teradata Databaseは調整中に2番目のパーティションの行をスキャンしません。

    • CASE_N(j ≥ CURRENT_DATE           /* Current quarter */,

      j ≥ CURRENT_DATE - INTERVAL '3' MONTH

      AND j <  CURRENT_DATE               /*previous quarter*/,

      NO CASE                     /* old quarters */)

      この場合、式がすべて近接しているため、Teradata Databaseは、調整中に「old quarters」という注釈が付けられている最後のパーティションの行をスキャンしません。

    • CASE_N式でNO CASEを指定し、複数の条件式でCURRENT_DATEを指定する場合、Teradata Databaseは調整中にNO CASEパーティションをスキャンします。

      DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を使用して1つの条件式のみを指定するとき、Teradata Databaseは、DATE、CURRENT_DATE、またはCURRENT_TIMESTAMPを使用して最初に指定されている条件式が連続していない場合にのみ、調整中にNO CASEパーティションをスキャンします。

      例えば、以下の式では、そのような最適化が提供されます。

      CASE_N(j >= CURRENT_DATE /* current quarter */

      j ≥ CURRENT_DATE = INTERVAL ' 3 ' MONTH

         AND j < CURRENT_DATE /* previous quarter */, NO CASE)

      この場合、Teradata Databaseは、調整時に「previous quarter」というラベルの付いた2番目のパーティションの行をスキャンしません。

      CASE_N(j ≥ CURRENT_DATE   /*current quarter*/,

      j ≥ CURRENT_DATE - INTERVAL '3' MONTH

      AND j < CURRENT_DATE    /*previous quarter*/

      NO CASE                 /*old quarters*/)

      この場合、Teradata DatabaseはNO CASEパーティションをスキャンします。2番目の式と3番目の式の間は3か月空いているため、これは連続していない例です。

      CASE_N(j ≥ CURRENT_DATE               /*current quarter*/,

      j ≥ CURRENT_DATE - INTERVAL '3' MONTH

      AND j <  CURRENT_DATE               /*previous quarter*/,

      j <  CURRENT_DATE-INTERVAL '3' MONTH /*old quarter*/,

      NO CASE)

      この場合、Teradata Databaseは調整中にパーティション1と2をスキャンしますが、パーティション3と4はスキップします。式1、2、および3はすべて近接しているため、NO CASEパーティションはスキップされます。

    • CASE_N式でUNKNOWNパーティションを指定する場合、Teradata Databaseは調整中に常にそれをスキャンします。

      NO CASE OR UNKNOWNパーティションを指定した場合にも、このようになります。

    • Teradata Databaseは、DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数のいずれも指定しない条件式を使用して定義されたパーティションをスキャンしません。ただし、DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を指定する条件式の前に定義されている場合を除きます。その場合は、スキャンが実行されます。

      DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を指定する条件式を定義する前に、DATE関数、CURRENT_DATE関数、またはCURRENT_TIMESTAMP関数を指定しないすべての条件式を指定する必要があります。

      例えば、次の式は、すべてこの最適化を利用できます。

      • CASE_N(j ≥CURRENT_DATE /* current quarter */,

        j ≥CURRENT_DATE - INTERVAL '3' MONTH AND j < CURRENT_DATE

        /* previous quarter */, NO CASE)

      • CASE_N(j ≥CURRENT_DATE /* current quarter */,

        j ≥CURRENT_DATE-INTERVAL '3' MONTH AND j < CURRENT_DATE

        /* previous quarter */,

        j <CURRENT_DATE-INTERVAL '6' MONTH, /* old quarters */ NO CASE)

        この連続していないケースでは、システムはNO CASEをスキャンします。2番目と3番目の式の間に3か月の間隔があります。