テーブルを1つ以上のパーティション レベルでパーティションすることを指定します。
組み合わせパーティションの数だけ多種多様なパーティションを定義できます。ただし、特定のパーティションを定義することによる利便性およびそれがパフォーマンスと記憶域に及ぼすプラスとマイナスの両方の影響を考慮する必要があります。
行レベル セキュリティ制約列を含むパーティション レベルを指定することはできません。
文字パーティション レベルは、Kanji1またはKanjiSJISサーバー文字セットを使用する列または定数に指定できません。
- グローバル一時
- 揮発
パーティションNoPIテーブルまたはPAテーブルは、列パーティション化される必要があり、行パーティション化される場合もあります。
- UDT
- ARRAY/VARRAY
- BLOB
- CLOB
- Period
- XML
- Geospatial
- JSON
- DATASET
ただし、BEGINバウンド関数とENDバウンド関数を使用すると、間接的にPeriod列を参照できます。 例: ENDバインド関数を使用したCASE_Nパーティション式を参照してください。
例: CURRENT_DATE関数で定義されたパーティションNUPIの指定
この例は、パーティション式でCURRENT_DATE関数を使用して、生命保険の顧客テーブルを履歴(期限切れ)ポリシーおよび現行ポリシーにパーティション化します。
CREATE TABLE customer ( cust_name CHARACTER(8), policy_number INTEGER, policy_expiration_date DATE FORMAT 'YYYY/MM/DD') PRIMARY INDEX (cust_name, policy_number) PARTITION BY CASE_N(policy_expiration_date>= CURRENT_DATE, NO CASE);
例: 同じ列セットでUSIを定義した、RANGE_N関数によってパーティション化されるパーティションNUPIの指定
この例は、o_orderkey上でPPIを、また同じ列セット上でUSIを作成します。リクエストは、o_orderdate上のRANGE_N関数をパーティション式の基礎とします。
パーティション式がo_orderdateに基づいており、その列がプライマリ インデックス列セットに含まれていないため、PPIを固有として定義することはできません。
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_orderpriority CHARACTER(21), o_clerk CHARACTER(16), o_shippriority INTEGER, o_comment VARCHAR(79)) PRIMARY INDEX (o_orderkey) PARTITION BY RANGE_N(o_orderdate BETWEEN DATE '1992-01-01' AND DATE '1998-12-31' EACH INTERVAL '1' MONTH) UNIQUE INDEX (o_orderkey);
例: RANGE_N関数で定義された狭い範囲でのパーティション固有PIの指定
この例は、store_id、product_id、およびsales_dateに固有PIを作成し、そのパーティション式をsales_dateのRANGE_N関数に基づくようにします。セカンダリ インデックスは定義されません。
この例は、5ヶ月分の1日ごとのパーティションを提供します。
パーティション式がsales_dateに基づいており、その列がプライマリ インデックス列セットに含まれているため、PIを固有として定義することができます。
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(sales_date BETWEEN DATE '2001-01-01' AND DATE '2001-05-31' EACH INTERVAL '1' DAY);
例: USIを使用せず、RANGE_N関数でパーティション化されるパーティションNUPIの指定
この例は、非固有PIをl_orderkeyに作成し、そのパーティション式をl_shipdateのRANGE_N関数に基づくようにします。セカンダリ インデックスは定義されません。
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_shipdate BETWEEN DATE '1992-01-01' AND DATE '1998-12-31' EACH INTERVAL '1' MONTH);
例: EXTRACT関数で定義されたパーティションUPIの指定
この例は、store_id、product_id、およびsales_dateに固有PIを作成し、そのパーティション式をsales_dateのEXTRACT関数に基づくようにします。sales_by_monthにセカンダリ インデックスは定義されません。
CREATE TABLE sales_by_month ( 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 EXTRACT(MONTH FROM sales_date);
例: RANGE_N関数で定義された広い範囲でのパーティションUPIの指定
次の例では、4年分の1週ごとのパーティションを提供します。
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(sales_date BETWEEN DATE '1997-01-01' AND DATE '2000-12-31' EACH INTERVAL '7' DAY);
例: CASE_Nパーティションで定義されたPI指定
次の例はstore_id、product_id、およびsales_date上にNUPIを作成し、total_revenueをそのCASE_Nパーティション式の基礎にします。total_revenueはプライマリ インデックス列セットで定義されていないので、このテーブルのプライマリ インデックスを固有として定義することはできません。
CREATE TABLE store_revenue ( 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)) PRIMARY INDEX (store_id, product_id, sales_date) PARTITION BY CASE_N(total_revenue < 10000, total_revenue < 100000, total_revenue < 1000000, NO CASE, UNKNOWN);
列セット(store_id、product_id、sales_date)の固有性を確認する場合、そのセットでUSIを定義します。
例: すべてのパーティション列がプライマリ インデックス定義に含まれないUPIの無効な指定
次の例ではstore_id、product_id、およびsales_date上に固有PIを作成しようとしますが、テーブルがパーティション化されるtotal_revenueが固有PI定義に含まれていないため、失敗します。すべてのパーティション列がインデックス定義に含まれていない限り、PIを固有にすることはできません。
CREATE TABLE store_revenue ( 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 CASE_N(total_revenue < 10000, total_revenue < 100000, total_revenue < 1000000, NO CASE, UNKNOWN);
例: 単純な算術式を使用するパーティションUPIの指定
次の例は、store_id、product_id、およびsales_dateに固有PPIを作成します。そのパーティション式をstore_idおよびproduct_idの単純な算術式に基づくようにします。セカンダリ インデックスは定義されません。
CREATE TABLE store_product ( store_id INTEGER NOT NULL BETWEEN 0 AND 64, product_id INTEGER NOT NULL BETWEEN 0 and 999, 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 store_id*1000 + product_id + 1;