NO RANGEおよびUNKNOWNパーティションの目的と動作 - Advanced SQL Engine - Teradata Database

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

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

パーティションに分割される列の値はnullとして評価されるため、システムはUNKNOWNパーティションを使用して、パーティション番号を評価できない行に割り当てます。

RANGE_N関数を使用してパーティション式を指定することによってパーティション化されたテーブルを作成するときに、NO RANGEパーティションを定義せずにとします。このとき、WITH INSERT [INTO]句を指定したALTER TABLE文を使用してテーブル定義を変更すると、パーティション番号が1以上、9,223,372,036,854,775,805以下に評価されない行は、すべてソース テーブルから削除され、WITH INSERT [INTO]句で指定したターゲット保存テーブルに移動されます。

NO RANGEパーティションを指定したRANGE_N関数でパーティション式を指定してパーティション化されたテーブルを作成する場合は、パーティションを削除するALTER TABLE文の中でWITH DELETEまたはWITH INSERT [INTO]句を指定している場合でも、削除されたパーティションの行はNO RANGEパーティションに移動されます。これは、NO RANGEパーティションの定義に、明示的に定義されたパーティション範囲にパーティション番号が評価されない行、または1以上、9,223,372,036,854,775,805以下の有効なパーティションとして評価されない行がすべて含まれているためです。

このことは、ALTER TABLE文にWITH INSERT [INTO]句またはWITH DELETE句を指定してNO RANGEパーティションを定義した、パーティション化されたテーブルで確認することができます。データは別のテーブルに移動されることも、指定されたテーブルから削除されることもありません。その代わりに、同じテーブルのNO RANGEパーティションに移動されます。

例えば、以下のPPIテーブルの定義について考えてみましょう。

CREATE SET TABLE ppi_salestable, NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT (
  prod_code           CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
  sales_date          DATE FORMAT 'YYYY-MM-DD',
  agent_id            CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
  quantity_sold       INTEGER,
  prod_description    VARCHAR(50) CHARACTER SET LATIN NOT
                      CASESPECIFIC)
PRIMARY INDEX ( product_code, sales_date, agent_id )
PARTITION BY RANGE_N(sales_date
          BETWEEN DATE '2001-01-01'
              AND DATE '2001-12-31' EACH INTERVAL '1' MONTH,
                       '2002-01-01'(DATE)
              AND      '2002-12-31'(DATE) EACH INTERVAL '1' MONTH,
                       '2003-01-01'(DATE)
              AND '2003-12-31'(DATE) EACH INTERVAL '1' MONTH,
          NO RANGE);

このテーブルには37個のパーティションがあります。 パーティションが定義されている3年間の月ごとに1つずつと、NO RANGEに対して1つです。 NO RANGEおよびUNKNOWNパーティションのパーティション番号としては、固定パーティション番号が内部的に割り当てられます。そのため、これらのパーティション番号は、特定のパーティション化されたテーブルのうち番号が最大のパーティションになるとは限りません。

また、ALTER TABLE文のWITH INSERT [INTO]句のターゲット テーブルとして使用する、以下のテーブルも作成します。

CREATE SET TABLE ppi_salestable1, NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT (
  prod_code           CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
  sales_date          DATE FORMAT 'YYYY-MM-DD',
  agent_id            CHAR(8) CHARACTER SET LATIN NOT CASESPECIFIC,
  quantity_sold       INTEGER,
  prod_description    VARCHAR(50) CHARACTER SET LATIN NOT
                      CASESPECIFIC)
PRIMARY INDEX (prod_code, sales_date, agent_id)
PARTITION BY RANGE_N(sales_date
          BETWEEN DATE '2001-01-01'
          AND     DATE '2001-12-31'
          EACH INTERVAL '1' MONTH,
         NO RANGE);

ここで、ソース テーブルにいくつかの行を挿入します。

INSERT INTO ppi_salestable VALUES('PC2','2001-01-10','AG2',5,'PC');

INSERT INTO ppi_salestable VALUES('PC3','2001-03-10','AG2',5,'PC');

INSERT INTO ppi_salestable VALUES('PC4','2002-05-10','AG2',5,'PC');

INSERT INTO ppi_salestable VALUES('PC5','2003-07-10','AG2',5,'PC');

INSERT INTO ppi_salestable VALUES('PC5','2004-07-10','AG2',5,'PC');

テーブルからすべての列を選択して、挿入しようとしていた行が実際に挿入されていることを確認します。

SELECT PARTITION, prod_code, sales_date, agent_id, quantity_sold,
                  prod_description
FROM ppi_salestable
ORDER BY 1;

PARTITION prod_code sales_date agent_id quantity_sold prod_description
--------- --------- ---------- -------- ------------- ----------------
        1 PC2       2001-01-10 AG2                  5 PC
        3 PC3       2001-03-10 AG2                  5 PC
       17 PC4       2002-05-10 AG2                  5 PC
       31 PC5       2003-07-10 AG2                  5 PC
       37 PC5       2004-07-10 AG2                  5 PC

ここで、WITH INSERT INTO句で指定されたテーブルppi_salestable1に移動するため、2001年の12個のパーティションを削除します。

ALTER TABLE ppi_salestable
  MODIFY PRIMARY INDEX (product_code, sales_date, agent_id)
  DROP RANGE BETWEEN DATE '2001-01-01'
             AND     DATE '2001-12-31'
                  EACH INTERVAL '1' MONTH
     WITH INSERT INTO ppi_salestable1;

*** Table has been modified.
*** Total elapsed time was 1 second.

2001年のパーティションのセットを削除したら、簡単なチェックを実行して、これらのパーティションの行がppi_salestableからppi_salestable1に移動されたことを確認します。

SELECT PARTITION, prod_code, sales_date, agent_id, quantity_sold,
       prod_description
FROM ppi_salestable
ORDER BY 1;

*** Query completed. 5 rows found. 6 columns returned.
*** Total elapsed time was 1 second.
PARTITION prod_code sales_date agent_id quantity_sold prod_description
--------- --------- ---------- -------- ------------- ----------------
       5 PC4       2002-05-10 AG2                  5 PC
      19 PC5       2003-07-10 AG2                  5 PC
      25 PC2       2001-01-10 AG2 5 PC 
      25 PC3       2001-03-10 AG2 5 PC 
      25 PC5       2004-07-10 AG2                  5 PC

意図したとおりにデータがppi_salestable1に移動されてない、代わりに同じテーブルppi_salestable内のNO RANGEパーティションに移動されています(太字で表示されている項目を参照)。これは、ppi_salestableにNO RANGEパーティションが存在するためです。この指定により、ppi_salestableから削除されたパーティションの行、またはそのパーティション番号によって1~9,223,372,036,854,775,805の範囲外の値として評価される行は、NO RANGEパーティションに移動されます。WITH INSERT [INTO]またはWITH DELETE句を定義したかどうかは関係ありません。したがって、これらの句により提供される機能を使用する場合は、ソース テーブルのNO RANGEパーティションを指定ないでください。

テーブルのパーティション変更に関するルールを参照してください。RANGE_NとCASE_N関数の詳細、システムでこれらの関数を使用してパーティション番号を決定する方法になどについては、Teradata Vantage™ - SQL関数、式、および述部、B035-1145を参照してください。