17.10 - CASE_NまたはRANGE_N文字列を使用したパーティション式 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

CASE_N関数を使用して文字パーティション式を定義することにより、特定の条件に基づいてテーブルの行をパーティションにグループ化できます。次に、評価がUNKNOWNである条件を検出しない、評価がTRUEである最初の条件の数を返す条件を評価できます。また、さまざまなオプションを使用して、条件の評価がUNKNOWNである、またはすべての条件の評価がFALSEであるケースを処理できます。

次の比較演算子および文字列関数をCASE_N関数内で使用すると、式がパーティション式の一部でないときに、現在のセッション照合を使用してパーティション式の文字列を評価できます。
  • =
  • <
  • >
  • >=
  • =<
  • <>
  • BETWEEN
  • LIKE

列パーティションのパーティション式の1つでCASE_N関数を使用した場合、テーブルまたは結合インデックスが作成された時点で、またはそのパーティションが変更された時点で有効だったセッション照合が、すべての比較で使用されます。

CREATE TABLE文を使用して作成される列パーティションのCASE_N式のルールは、以下に挙げる例外を除いて、非文字パーティション式の場合と同じです。
  • 単一レベル パーティションの場合に、パーティション式がINTEGERデータ型のRANGE_N関数のみで構成されているときには、定義するパーティションの合計数(すべての範囲パーティションと、もし指定されている場合には、NO RANGEパーティション、UNKNOWNパーティション、およびNO RANGE OR UNKNOWNパーティションを含む)は、2,147,483,647以下でなければなりません。
  • テーブルからプライマリ インデックス定義をコピーし、CREATE TABLE … AS … WITH [NO] DATA文を使用して別のテーブルを作成する場合、およびソース テーブルのプライマリ インデックスがパーティション化される場合、コピーされたテーブル定義が、同じ方法でパーティション化されます。

    データベースは、ターゲット テーブルの定義に対して、ソース テーブルの文字パーティションで使用された照合を使用します。

    セッション照合は、ソース テーブルの文字パーティションの照合と同じでなくても構いません。

    ソース テーブルの照合がMULTINATIONALまたはCHARSET_COLLであり、照合または照合文字セットの定義がテーブルの作成以降変更されている場合、CREATE TABLE … AS文を使用すると、リクエスト元にエラーが返されます。

    CREATE TABLE … AS文を使用してテーブルをコピーする前に、そのテーブルを再検証する必要があります。

    CREATE TABLE … AS文のルールは、その他の点では、文字パーティションを設定していないテーブルと同じです。

  • 文字またはグラフィックの比較を使用してパーティション式を定義できますが、パーティション式はKanji1またはKanjiSJIS列または定数式では定義できません。
    パーティション式では、UPPERCASEの修飾子および次の文字関数を指定できます。
    • CHAR2HEXINT
    • INDEX
    • LOWER
    • MINDEX
    • POSITION
    • TRANSLATE
    • TRANSLATE_CHK
    • TRIM
    • UPPER
    • VARGRAPHIC

      パーティション式の式および参照される列では、BLOBデータ型、CLOBデータ型、またはGeospatialデータ型を使用しないようにする必要があり、次の関数および関数の種類を使用して定義することもできません。

    • 外部UDF
    • SQL UDF
    • 以下の関数を含む、組み込み関数
      • 集約関数
      • 行をグループ化するOLAP関数
      • HASHAMP関数
      • HASHBAKAMP関数
      • RANDOM関数
    • ROWIDキーワード
    • PARTITION列またはPARTITION[#Ln]列
    • 集合演算子
    • Subquery

    パーティション式は、テーブルの1つ以上の列に基づいている必要があります。特に、パーティション式は、行内の列に基づく確定的な式である必要があります。

  • 任意の文字パーティション レベルのパーティション式の評価では、比較演算子の文字データの順序を決定するために、テーブルが作成されたときに有効なセッション照合を使用します。
  • 任意の文字パーティション レベルのRANGE_N関数に基づかないパーティション式の評価では、比較演算子および文字列関数の文字データの順序を決定するために、テーブルが作成されたときに有効だったのと同じ大文字と小文字の区別のルールを使用します。
    テーブルが作成されるセッションのモード 定数リテラルと比較するすべての場合でのリテラルの処理
    ANSI CASESPECIFIC。ただし、定数リテラルが、NOT CASESPECIFICに明示的にキャストされる場合を除きます。

    比較の式がCASESPECIFICの場合、比較は大文字と小文字を区別します。それ以外の場合は大文字と小文字を区別しません。

    Teradata デフォルトでNOT CASESPECIFICです。

    定数とNOT CASESPECIFIC列または式の間の比較は、定数リテラルが明示的にCASESPECIFICにキャストされる場合を除き、大文字と小文字を区別しないものとして処理されます。

    文字データの比較での大文字と小文字の区別のルールの詳細は、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。

  • 特定のパーティション レベルでのパーティション式は、パーティション列を含むDMLリクエストのWHERE句条件またはON句条件で一般的に使用されているものと同様の大文字と小文字の区別を、比較関数および文字列関数で使用する必要があります。使用しないと、文字パーティションが静的または動的のいずれかでパーティションを排除する最適化の対象にならない場合があります。行パーティション排除の詳細は、<Teradata Vantage™ - データベースの設計、B035-1094>および<Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142>を参照してください。行パーティションを静的に排除する場合、そのパーティションに関連付けられた条件式は、すべてが大文字と小文字の区別を同じように行なう述部の組み合わせにする必要があります。
  • 任意の文字パーティション レベルのRANGE_Nパーティション式の評価は、テーブルが作成されたとき、ただしテスト値が明示的なCASTのない文字列リテラルを含まない式である場合にのみ、セッションに対して有効であるデフォルトの大文字と小文字の区別のルールに従いません。
  • RANGE_Nパーティション式では、次のようになります。
    テスト値 範囲の境界
    NOT CASESPECIFIC NOT CASESPECIFIC
    CASESPECIFIC CASESPECIFIC
  • テスト値がNOT CASESPECIFIC列または式、および明示的なキャストがない文字列リテラルを含む式である場合、テスト値は次の表で説明するように動作します。
    パーティションが作成されるセッションのモード テスト値
    ANSI CASESPECIFICです。
    Teradata RANGE_N式のテスト値はNOT CASESPECIFICです。
  • RANGE_N関数の結果の値は、BYTEINT、BIGINT、INTEGER、SMALLINT、DATE、TIMESTAMP(n)、TIMESTAMP(n) WITH TIME ZONE、CHARACTER、またはVARCHARのいずれかのデータ型でなければなりません。
  • パーティション プライマリ インデックス定義のすべてのパーティション式で参照されるすべての定数リテラルのサイズ合計は、64 KB未満である必要があります。それ以上になると、CREATE TABLE文はリクエスト元にエラーを返します。
  • システムで複数の文字セットを使用する場合、常にUnicodeのサーバー文字セットを使用して 文字パーティション列を作成し、同じサーバー文字セットを使用してパーティション列を格納する必要があります。そうしないと、行キー ベースのマージ結合を使用できるこのテーブルに対するDMLリクエストが、同一のパーティションを持つ2つパーティション化されたテーブルの間の直接の行キー ベースのマージ結合に制限される場合があります。

    Unicodeのサーバー文字セットを使用して文字パーティション列を作成する別の理由として、動的行パーティション排除の完全な最適化があります。Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142を参照してください。

  • 最適化に文字パーティションを使用できるケースを最大化するには、文字パーティション式のセットにNOT CASESPECIFICの列が含まれている場合、パーティション化されたテーブルをTeradataモード セッションで作成する必要があります。比較のすべての定数文字式および非定数文字式は、NOT CASESPECIFICとして定義する必要があります。

    パーティション列がCASESPECIFICである場合、パーティションはANSIモード セッションで作成するか、または比較で指定される非定数文字式をCASESPECIFICとして定義する必要があります。

    すべての比較がCASESPECIFICであることを確認する最も簡単な方法は、(パーティション列の式の代わりに)CASESPECIFICパーティション列と定数式の間でこれらの比較を行なうことです。

    静的なパーティション排除を有効にするためにすべての比較で大文字と小文字の同じ区別を使用する必要があります。推奨される最善の方法は、すべてのパーティションで大文字と小文字を区別しないよう指定することです。これにより、大文字と小文字を区別しないWHERE句条件または大文字と小文字を区別するWHERE句条件のどちらの存在を指定した場合でも、パーティション排除が有効になります。

  • データベースは修飾子が存在する場合に、CREATE TABLE文のセッション クライアント文字セット、または明示的に指定された文字セットから、比較の非定数式の文字セットに、パーティション式比較操作の文字列リテラルを変換する場合があります。データベースは常に、RANGE_N関数に基づくパーティション式に対してこの変換を実行します。

    例えば、CASE_N (t1.a < 'cat')(t1.aは非定数式、'cat'は文字列リテラル)について考えます。文字列リテラルで指定される文字は、クライアント文字セット内に存在するものでなければならず、サーバー文字セットへの非定数式の適切な変換が実行されるようにする必要があります。SHOW TABLE文を実行して、その文が返すSQL作成テキストを調べ、望ましくない変換がシステムによって実行されていないことを確認する必要があります。

    次の例では、文字パーティション式での日本語固有のテーブル意文字の使用の例を示します。

    CREATE SET TABLE df2.t1c, FALLBACK, NO BEFORE JOURNAL,
                         NO AFTER JOURNAL, CHECKSUM = DEFAULT (
      c1 INTEGER,
      c2 CHARACTER(30) CHARACTER SET UNICODE NOT CASESPECIFIC,
      c3 CHARACTER(4)  CHARACTER SET GRAPHIC CASESPECIFIC)
    PRIMARY INDEX (c1)
    PARTITION BY CASE_N(c2 BETWEEN ''
                           AND     '',
                        c2 = '',
                        c2 BETWEEN ''
                           AND     '',
                        NO CASE, UNKNOWN);

    BTEQ、またはKanjiEUC_0Uなどのクライアント文字セットをネイティブでサポートしていない別のクライアントAPIを使用して同じテーブルを作成するには、日本語の表意文字を使用する代わりに、次のように16進数のUnicodeリテラルを使用してテーブルを作成する必要があります。

    CREATE SET TABLE df2.t1c, FALLBACK, NO BEFORE JOURNAL,
                              NO AFTER JOURNAL, CHECKSUM = DEFAULT (
      c1 INTEGER,
      c2 CHARACTER(30) CHARACTER SET UNICODE NOT CASESPECIFIC,
      c3 CHARACTER(4)  CHARACTER SET GRAPHIC CASESPECIFIC)
    PRIMARY INDEX (c1)
    PARTITION BY CASE_N(c2 BETWEEN _UNICODE '9758'XC
                          AND     _UNICODE '9759'XC,
                        c2 =       _UNICODE '9797'XC,
                        c2 BETWEEN _UNICODE '97D3'XC
                           AND     _UNICODE '9AFB'XC,
                        NO CASE, UNKNOWN);

    指定した文字列リテラルに対してクライアント文字セットが適切であり、CASE_Nパーティションで比較されているRANGE_N式または非定数式のテスト値のサーバー文字セットとクライアント文字セットに互換性があることを確認する必要があります。この確認は、データベースで自動的には実行されません。