17.05 - パーティション レベル - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Release Date
2021年1月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-175K-JPN
Language
日本語 (日本)
partitioning_level
パーティション レベルは、単一のCOLUMNキーワード、パーティション式、またはその両方の組み合わせを使用して定義できます。
複数のパーティション レベルは、カンマで区切る必要があり、そのセット全体は括弧で囲む必要があります。
指定可能なパーティション レベルの最大数は、次のとおりです。
  • 2バイトのパーティションは15
  • 8バイトのパーティションは62
パーティション式がRANGE_NまたはCASE_N関数ではない場合は、パーティションのレベルのみがある場合にのみ許可され、その結果は暗黙的にINTEGER型にキャストするための条件を常に満たしている必要があります(まだINTEGER型ではない場合)。
COLUMN
列パーティション コンテナはCOLUMN形式で格納されます。
partitioning_expression
CASE_N関数を使用して、条件とINTEGERまたはBIGINT数の間のマッピングを定義します。
CASE_Nパーティション レベルのパーティションの最大数は通常4,000以下に制限されます。
RANGE_N関数を使用して、INTEGER、CHARACTER、またはDATE値の範囲のINTEGER数へのマッピングの定義、またはBIGINTまたはTIMESTAMP値の範囲のBIGINT数へのマッピングの定義を行ないます。
RANGE_Nパーティション レベルのNO RANGE、NO RANGE OR UNKNOWN、およびUNKNOWNパーティションを含まない、範囲の最大数は9,223,372,036,854,775,805です。
RANGE_N関数が文字またはグラフィックのテスト値を指定する場合、EACH句を指定することはできません。
CASE_N関数とRANGE_N関数の資料については、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください。
(COLUMN column_name)
列パーティション コンテナはCOLUMN形式で格納されます。
COLUMN句の列グループ化により、テーブル要素リストの表示順序(つまり、アスタリスクを使用してテーブルから列を選択する場合)の指定を可能にしながら、どの列がどのパーティションに配置するかをさらに柔軟に指定できます。テーブルの列リストによる列グループ化により、パーティション レベルでの指定より単純ですが、柔軟性には劣る列グループ化の指定が可能になります。
(ROW column_name)
列パーティションは、ROW形式で格納されます。ROW形式は、1つの列パーティション値のみが物理行に副行として格納されることを意味します。
列パーティションに対してCOLUMNとROWのどちらも指定しない場合、Vantageは列パーティションにCOLUMNとROWのどちらを使用するかを決定します。COLUMN形式とROW形式については、<Teradata Vantage™ - SQLデータ定義言語 - 詳細トピック、B035-1184>の「CREATE TABLE」を参照してください。
AUTO COMPRESS
Vantageが物理行のサイズを減らせる場合、最適な圧縮方法を自動的に決定して適用します。AUTO COMPRESSは、COLUMN形式列のパーティションのデフォルト値です。
ADD constant
定義するパーティションの数にconstantによって指定されるBIGINT定数値を加算した数に、パーティション レベルのパーティションの最大数を指定します。
constantの値は、符号なしのBIGINT定数にする必要があり、9,223,372,036,854,775,807を超えることはできません。
ALL BUT (column_name_list)
列グループ リストに指定されていない各列に対して、自動圧縮の単一列パーティションおよびシステム決定のCOLUMN形式またはROW形式(存在する場合)が定義されるように指定します。
このオプションは、列パーティション テーブルにのみ指定できます。
NO AUTO COMPRESS
列パーティション テーブルの列パーティションの物理行の自動圧縮を無効にします。Vantageは、COLUMN形式列のパーティションの物理行に対して最適な圧縮方法を自動的に決定して適用しません。
Vantageは、ユーザー指定の圧縮があればそれを適用し、COLUMN形式の列パーティションには行ヘッダー圧縮を適用します。

例: プライマリ インデックスで定義されているUSIのないマルチレベル パーティションUPI

次の例では、両方のパーティション式の基礎としてRANGE_N関数を使用して、2つのレベルのパーティションが作成されます。両方のパーティション列はプライマリ インデックスのコンポーネントなので、インデックスをUPIとして定義することができます。

     CREATE TABLE sales (
       store_id      INTEGER NOT NULL,
       product_id    INTEGER NOT NULL,
       sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       total_revenue DECIMAL(13,2),
       total_sold    INTEGER,
       note          VARCHAR(256))
     UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
     PARTITION BY (RANGE_N(store_id   BETWEEN 1 
                                      AND   300 
                                      EACH    1),
                   RANGE_N(sales_date BETWEEN DATE '2006-01-01' 
                                      AND     DATE '2006-05-31' 
                                      EACH INTERVAL '1' DAY));

例: プライマリ インデックスで定義されているUSIのないマルチレベル パーティションNUPI

次の例では、両方のパーティション式の基礎としてRANGE_N関数を使用して、2つのレベルのパーティションが作成されます。どちらのパーティション列もプライマリ インデックスのコンポーネントではないため、そのインデックスはNUPIとして定義される必要があります。また、o_orderkeyではUSIが定義されていないため、固有ではありません。

     CREATE TABLE lineitem (
       l_orderkey      INTEGER NOT NULL,
       l_partkey       INTEGER NOT NULL,
       l_suppkey       INTEGER,
       l_linenumber    INTEGER,
       l_quantity      INTEGER NOT NULL,
       l_extendedprice DECIMAL(13,2) NOT NULL,
       l_discount      DECIMAL(13,2),
       l_tax           DECIMAL(13,2),
       l_returnflag    CHARACTER(1),
       l_linestatus    CHARACTER(1),
       l_shipdate      DATE FORMAT 'yyyy-mm-dd',
       l_commitdate    DATE FORMAT 'yyyy-mm-dd',
       l_receiptdate   DATE FORMAT 'yyyy-mm-dd',
       l_shipinstruct  VARCHAR(25),
       l_shipmode      VARCHAR(10),
       l_comment       VARCHAR(44))
     PRIMARY INDEX (l_orderkey)
     PARTITION BY (RANGE_N(l_suppkey  BETWEEN 0 
                                      AND  4999 
                                      EACH   10),
                   RANGE_N(l_shipdate BETWEEN DATE '2000-01-01' 
                                      AND     DATE '2006-12-31' 
                                      EACH INTERVAL '1' MONTH));

例: マルチレベル パーティションUPI

次の例では、両方のパーティション式の基礎としてRANGE_N関数を使用して、2つのレベルのパーティションが作成されます。両方のパーティション列はプライマリ インデックスのコンポーネントなので、インデックスをUPIとして定義することができます。

     CREATE TABLE sales_history (
       store_id      INTEGER NOT NULL,
       product_id    INTEGER NOT NULL,
       sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       total_revenue DECIMAL(13,2),
       total_sold    INTEGER,
       note          VARCHAR(256))
     UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
     PARTITION BY (RANGE_N(store_id   BETWEEN 1 
                                      AND   300 
                                      EACH    1),
                   RANGE_N(sales_date BETWEEN DATE '2004-01-01' 
                                      AND     DATE '2006-12-31' 
                                      EACH INTERVAL '1' MONTH));

例: パーティションの最大数があるマルチレベル パーティションNUPI

次の例では、2バイト パーティション番号組み合わせパーティション式に許可される最大65,535 (3*5*17*257)パーティションを指定します。どのパーティション列もプライマリ インデックスのコンポーネントではないため、そのインデックスはUPIとして定義できません。

     CREATE TABLE markets (
       product_id       INTEGER NOT NULL,
       region           BYTEINT NOT NULL,
       activity_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       revenue_code     BYTEINT NOT NULL,
       business_sector  BYTEINT NOT NULL,
       note             VARCHAR(256))
     PRIMARY INDEX (product_id, region) PARTITION BY (
       RANGE_N(region          BETWEEN 1 
                               AND     9 
                               EACH    3),
       RANGE_N(business_sector BETWEEN 0 
                               AND    49 
                               EACH   10),
       RANGE_N(revenue_code    BETWEEN 1 
                               AND    34 
                               EACH    2),
       RANGE_N(activity_date   BETWEEN DATE '1986-01-01' 
                               AND     DATE '2007-05-31' 
                               EACH INTERVAL '1' MONTH));

例: 同じ列パーティション テーブル定義の作成またはパーティションの変更を行なうための異なる構文の使用

この例は、すべて同じテーブルを定義する3つの異なった構文を示します。

最初の例は、列o_orderkeyにUSIのある列パーティション テーブルを定義します。o_comment以外の各列は、各自のパーティションに含まれており、システム決定のCOLUMNフォーマットを使用して格納され、自動圧縮されます。列o_commentは、それ独自のパーティションにあり、ROWフォーマットを使用して自動圧縮なしで格納されます。

そのMaximum Combined Partition Number(内部使用と予備のための2列パーティションを含む)は65,535より少ないので、このテーブルの各行のパーティション番号はその行のヘッダーで2バイト パーティション番号フィールドを使用します。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       ROW(o_comment  VARCHAR(79)) NO AUTO COMPRESS)
     PARTITION BY COLUMN,
     UNIQUE INDEX (o_orderkey);

2番目の例の異なる点は、列リストにo_commentのROW指定がなく、PARTITION BY COLUMN句のALL BUT (ROW(o_comment))指定に置き換えられていることです。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       o_comment      VARCHAR(79))
     PARTITION BY COLUMN ALL BUT (ROW(o_comment) NO AUTO COMPRESS),
     UNIQUE INDEX (o_orderkey);

3番目の例の異なる点は、COLUMN句のグループ化句にリストされていない列が、デフォルトで列パーティションに一緒にグループ化されていることです。しかし、o_shippriorityがCOLUMNグループ化句にリストされていない唯一の列なので、各列は各自の単一列パーティションに入ります。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       o_comment      VARCHAR(79))
     PARTITION BY COLUMN (o_orderkey, o_custkey, o_orderstatus,
                          o_totalprice, o_orderdate, 
                          ROW o_comment NO AUTO COMPRESS),
     UNIQUE INDEX (o_orderkey);

この例は再度、列パーティションordersテーブルを定義しますが、パーティションは前の例で使用されたものとは異なります。ROW形式で自動圧縮されるパーティションとしてグループ化されるo_totalpriceo_comment列以外の各列は、システム決定のCOLUMN形式で自動圧縮されるものとして、各自のパーティションに入ります。

組み合わせパーティションの最大数が65,534で最大列パーティション番号が65,535なので、このテーブルの各行のパーティション番号には2バイト パーティションが使用されます。

このテーブルのパーティション レベルに65,526という大きさの値でADD句を指定しても、この構文は同じテーブルを定義します。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       o_comment      VARCHAR(79))
     PARTITION BY COLUMN ALL BUT (ROW(o_totalprice, o_comment)),
     UNIQUE INDEX (o_orderkey);

この例は再度、列パーティションordersテーブルを定義しますが、パーティションは前の例とは異なります。各列は各自のパーティションに入ります。このリクエストは7パーティションに加えて、すべての列パーティション テーブルで使用される2つの内部パーティションを定義します。

このテーブルの列パーティションの最大数が9,223,372,036,854,775,806で最大列パーティション番号が9,223,372,036,854,775,807なので、このテーブルの各行は8バイト パーティションを必要とします。これは、この例を以前の列パーティション テーブルの例と区別するものでもあります。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       o_comment      VARCHAR(79))
     NO PRIMARY INDEX PARTITION BY COLUMN ADD 68000,
     UNIQUE INDEX (o_orderkey);

この例は、前の例と同じordersテーブルを定義します。唯一の相違点は、パーティション式のADDオプションに値が指定されていることです。各列は各自のパーティションに入ります。このリクエストは7パーティションに加えて、すべての列パーティション テーブルで使用される2つの内部パーティションを定義します。

このテーブルの列パーティションの最大数が9,223,372,036,854,775,806で最大列パーティション番号が9,223,372,036,854,775,807なので、このテーブルの各行のパーティション番号は8バイト パーティションを必要とします。これは、この例を以前の列パーティション テーブルの例と区別するものでもあります。

     CREATE TABLE orders (
       o_orderkey     INTEGER NOT NULL,
       o_custkey      INTEGER,
       o_orderstatus  CHARACTER(1) CASESPECIFIC,
       o_totalprice   DECIMAL(13,2) NOT NULL,
       o_orderdate    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_shippriority INTEGER,
       o_comment      VARCHAR(79))
     PARTITION BY COLUMN ADD 9223372036854775797,
     UNIQUE INDEX (o_orderkey);

例: ROW形式の列パーティション テーブルの作成

この例は、すべて明示的に指定されているか、またはシステム決定によるROW形式の3つの列パーティションのある列パーティション テーブルを定義します。

     CREATE MULTISET TABLE sensordata (
       id VARCHAR (128),
       m1 VARBYTE(10000),
       m2 VARBYTE(10000),
       m3 VARBYTE(10000),
       t1 TIMESTAMP(6) WITH TIME ZONE,
       t2 TIMESTAMP(6) WITH TIME ZONE,
       t3 TIMESTAMP(6) WITH TIME ZONE,
       t4 TIMESTAMP(6) WITH TIME ZONE )
     PARTITION BY COLUMN (ROW(id), (m1, m2, m3),
                          ROW(ts1, ts2, ts3, ts4));

例: 列パーティション テーブルでのADDオプションの使用

この例は、最大9,999の列パーティション(3つのユーザー指定、2つの内部使用、さらに追加するための9,994パーティション)と10,000という最大列パーティション数を定義します。

Maximum Combined Partition Numberは、各レベルにおけるパーティションの最大数の積になります。テーブルt23については、Maximum Combined Partition Numberは以下のように計算されます。

Maximum Combined Partition Number = 10000 x 10000000 x 92233720 = 9223372000000000000

これは、限界の9,223,372,036,854,775,807を超えていないので、有効な最大値になります。超過組み合わせパーティションがあるものの、レベル2またはレベル3にパーティションを追加するには不十分なため、レベル2と3のパーティション数はALTER TABLEリクエストを使用して増やすことはできません。

     CREATE MULTISET TABLE t23 (
       a INTEGER, 
       b INTEGER, 
       c INTEGER)
     PARTITION BY (COLUMN ADD 9994,
                   RANGE_N(a BETWEEN     1 
                             AND 10000000 
                             EACH 1),
                   RANGE_N(b BETWEEN    1 
                             AND 92233720 
                             EACH 1));

レベル3のRANGE_N end_expression値を92,233,721に増やしたとします。これは、レベル3の前のend_expression値92,233,720より1大きいだけです。

     CREATE MULTISET TABLE t23a (
       a INTEGER, 
       b INTEGER, 
       c INTEGER)
     PARTITION BY (COLUMN ADD 9994,
                   RANGE_N(a BETWEEN     1 
                             AND 10000000 
                             EACH 1),
                   RANGE_N(b BETWEEN    1 
                             AND 92233721 
                             EACH 1));

t23aの テーブル定義は、t23の定義のように、最大9,999の列パーティション(3つのユーザー指定、2つの内部使用、さらに追加するための9,994パーティション)と10,000という最大列パーティション数を定義します。

しかし、このテーブルのMaximum Combined Partition Numberを計算するとどうなるかに注意してください。

Maximum Combined Partition Number = 10000 x 10000000 x 92233721 = 9223372100000000000

Maximum Combined Partition Numberがシステム最大値の9,223,372,036,854,775,807を超えるようになるので、Vantageは要求元にエラーを返します。

例: 列パーティション テーブルの組み合わせパーティションのパーティション レベルへの割り当て

他のパーティションがそれぞれのレベルに割り当てられた後、未割当組み合わせパーティションが残っている場合、この例が示すように、Vantageはそれらの未割当結合パーティションを以前に定義されていたパーティション レベルに割り当てようとします。

この例のCREATE TABLE SQLテキストは以下のようになります。

CREATE TABLE t38 (
   a INTEGER, 
   b INTEGER, 
   c INTEGER)
PARTITION BY (COLUMN,             -- 3 specified partitions+2 int-
             RANGE_N(c BETWEEN 1     ernal=5 defined partitions.
                       AND    10),-- 1 defined partition. Note
             RANGE_N(b BETWEEN 1     there is no EACH clause.
                       AND  1000 
                       EACH    1) ADD 5);
                                  -- 1000 partitions.
以下の、このテーブルのパーティション レベルの予備プロパティに注意してください。
  • パーティション レベル1

    テーブルt38は、パーティション レベル1に3つのユーザー指定パーティションを持つように定義されます。列a、列b、および列cのそれぞれに1つ。それに2つの内部パーティションを加えて、合計5つのパーティションが定義されます。デフォルトで、パーティション レベル1のADD定数は10になります。

    パーティション レベル1の列パーティションの最大数は15になります。これは、最初の5つの定義パーティションにデフォルトADD定数の10を加えて導出されます。

    レベル1の最大列パーティション数は16です。これは、このレベルの列パーティションの最大数に1を加えて導出されます(つまり15 + 1 = 16)。

定義されているパーティションの予備数 5
デフォルトADD定数値 10
最終ADD定数値 10
列パーティションのデフォルト最大数 15
列パーティションの最終最大数 15
予備最大列パーティション数 15
最終最大列パーティション数 16
  • パーティション レベル2

    パーティション レベル2はEACH句を指定しないRANGE_N関数を使用して定義されているので、その定義されたパーティションの数は1のみです。ADD定数を指定していないので、レベル2の列パーティションの初期最大数は1のみです。しかし、パーティション レベルの最大パーティション数は少なくとも2でなければならないので、レベル2の定義されるパーティションの実際の最大数は2になり、これは、このレベルの列パーティションの最大数になります。

    定義されているパーティションの予備数 1
    デフォルトADD定数値 1
    最終ADD定数値 3
    定義される列パーティションのデフォルト最大数 2
    定義される列パーティションの最終最大数 4
    予備最大列パーティション数 4
    最終最大列パーティション数 4
  • パーティション レベル3

    レベル3には、1,000個の定義されたパーティションと予備最大パーティション数1,005があります。これは、初期定義された1,000パーティションにADD定数値5を加えて導出されます。

    定義されているパーティションの予備数 1,000
    デフォルトADD定数値 5
    最終ADD定数値 23
    定義される列パーティションのデフォルト最大数 1,005
    定義される列パーティションの最終最大数 1,023
    予備最大列パーティション数 1,005
    最終最大列パーティション数 1,023

各レベルのデフォルト最大列パーティション数の積は16*2*1005 = 32,160になり、これは、32,160 ≤ 65,335なので、このテーブルは2バイト パーティションを定義します。

DefinedCombinedPartitions = 各レベルで定義されているパーティションの製品 = 5*1*1,000 =5,000
MaxCombinedPartitions = 各レベルの最大パーティションの製品 = 15*4*1,023 =61,380
Maximum Combined Partition Number = 各レベルの最大パーティション番号の製品 = 65,472

Maximum Combined Partition Number ≤ 65,535であるものの、いずれかのパーティション レベルの最大パーティション数が1だけ増えてもMaximum Combined Partition Numberの値 > 65,535となり、これは無効です。

以下のSELECTリクエストは、Vantaget38の各パーティション レベルに割り当てられた組み合わせパーティションの数を調整した後、テーブルt38の値をDBC.TableConstraintsで報告します。

     SELECT * 
     FROM DBC.TableConstraints
     WHERE TVMId IN (SELECT TVMId 
                     FROM DBC.TVM
                     WHERE TVMNameI = 't38' 
                     AND   DataBaseId IN (SELECT DatabaseId 
                                          FROM DBC.DBASE 
                                          WHERE DatabaseNameI ='test')) 
     ORDER BY TVMId;

このリクエストは、以下の結果セットを返します。

TVMId 000017070000
Name ?
DBaseId 0000F303
TableCheck CHECK (/*03 02 01*/ PARTITION#L1 /*1 5+10*/ =1 AND RANGE_N(c BETWEEN 1 AND 10 ) /*2 1+3*/ IS NOT NULL AND RANGE_N(b BETWEEN 1 AND 1000 EACH 1 ) /*3 1000+23*/ IS NOT NULL )
CreateUID 00000100
CreateTimeStamp 2010-12-12 18:16:38
LastAccessTimeStamp ?
AccessCount ?
ConstraintType Q
IndexNumber 1
ConstraintCollation U
CollName ?
CharSetID ?
SessionMode ?
VTCheckType ?
TTCheckType ?
ResolvedCurrent_Date ?
ResolvedCurrent_TimeStamp ?
DefinedCombinedPartitions 5000
MaxCombinedPartitions 61380
PartitioningLevels 3
ColumnPartitioningLevel 1