パーティションに分割される列の値は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を参照してください。