17.10 - 例: 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-1144-171K-JPN
Language
日本語 (日本)

この例は例: CASE_N関数を使用したCHARACTERパーティションに似ていますが、CASE_N関数およびLIKEの代わりにRANGE_N関数に基づくパーティション式を指定します。

この定義は、LIKE演算子を指定するCASE_N式では静的行パーティション排除がサポートされないため、例: CASE_N関数を使用したCHARACTERパーティションの定義よりも推奨されます。

この例では、last_nameの位置2の文字がSPACEであるため、'B'はパーティション2に入ります。last_nameの位置2の文字がSPACE文字より小さい文字(TABなど)として照合された場合、行はパーティション1に割り当てられます。

例: CASE_N関数を使用したCHARACTERパーティションでは、最初の文字が一致することが、対応するパーティションに行が割り当てられるために必要なすべてです。この場合、最初の2つのパーティションの条件がいずれもfalseになるため、この行はパーティション3に入ります: last_name < 'A' , last_name < 'B'

     CREATE TABLE accounts2 (
       cust_id     INTEGER,
       last_name   VARCHAR(30) NOT CASESPECIFIC, 
       first_name  VARCHAR(30), 
       city        VARCHAR(50))
     PRIMARY INDEX (cust_id)
     PARTITION BY RANGE_N(last_name BETWEEN 'A','B','C','D','E','F','G',
                        'H','I','J','K','L','M','N',
                        'O','P','Q','R','S','T','U',
                         'V','W','X','Y','Z' 
                                   AND
                  'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ',
             NO RANGE,UNKNOWN);

例: CASE_N関数を使用したCHARACTERパーティションの最初の部分のパーティション化は、CAST式を使用する、次のRANGE_Nパーティション式を使って重複させることができます。ただし、この形式のRANGE_Nパーティションは、RANGE_Nテスト値上にCASTがある場合、静的行パーティション排除が使用できないため、望ましくありません。

     PARTITION BY RANGE_N(CAST(last_name AS CHARACTER(1)) 
                          BETWEEN 'A','B','C','D','E','F','G',
               'H','I','J','K','L','M','N',
               'O','P','Q','R','S','T','U',
                'V','W','X','Y','Z' 
                          AND     'Z',
    NO RANGE,
    UNKNOWN);

各範囲の末尾に29個のNULLを付けて範囲を指定する以外は全く同じテーブルを作成することにより、このテーブルに対する静的パーティション排除を有効にすることができます。列がVARCHAR(30)として入力されているため、各範囲には先頭の1文字と、それに続いてその列に割り振られた残りの文字数である29文字分を埋めるだけのNULLが指定されます。当該列がVARCHAR(50)と指定された場合は、その範囲に対して各文字指定の末尾に49個のNULLを付ける、というようになります。RANGE_Nの例では16進文字リテラルを使用します。セッション文字セットがLatinの場合、各文字を表わすには2桁(58個のゼロ)が必要です。セッション文字セットがUnicodeの場合、各文字を表わすには4桁(116個のゼロ)が必要です。

このようにパーティション式を指定すれば、テーブルに実行されるリクエストに対して最適化ルーチンが静的パーティション排除を使用し、不要なパーティションを排除することによってテーブルのスキャンの速度が飛躍的に高まります。

     CREATE TABLE accounts2 (
       cust_id     INTEGER,
       last_name   VARCHAR(30) NOT CASESPECIFIC, 
       first_name  VARCHAR(30), 
       city        VARCHAR(50))
     PRIMARY INDEX (cust_id)
     PARTITION BY RANGE_N(last_name BETWEEN
                 ('A'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('B'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('C'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('D'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('E'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('F'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('G'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('H'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('I'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('J'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('K'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('L'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('M'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('N'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('O'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('P'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('Q'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('R'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('S'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('T'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('U'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('V'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('W'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('X'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('Y'||'0000000000000000000000000000000000000000000000000000000000'XC),
                 ('Z'||'0000000000000000000000000000000000000000000000000000000000'XC),
                  AND
                 ('{'||'0000000000000000000000000000000000000000000000000000000000'XC),
                                   UNKNOWN);