- partitioning_level
- パーティション レベルは、単一のCOLUMNキーワード、パーティション式、またはその両方の組み合わせを使用して定義できます。
- COLUMN
- 列パーティション コンテナはCOLUMN形式で格納されます。
- partitioning_expression
- CASE_N関数を使用して、条件とINTEGERまたはBIGINT数の間のマッピングを定義します。
- (COLUMN column_name)
- 列パーティション コンテナはCOLUMN形式で格納されます。
- (ROW column_name)
- 列パーティションは、ROW形式で格納されます。ROW形式は、1つの列パーティション値のみが物理行に副行として格納されることを意味します。
- AUTO COMPRESS
- Vantageが物理行のサイズを減らせる場合、最適な圧縮方法を自動的に決定して適用します。AUTO COMPRESSは、COLUMN形式列のパーティションのデフォルト値です。
- ADD constant
- 定義するパーティションの数にconstantによって指定されるBIGINT定数値を加算した数に、パーティション レベルのパーティションの最大数を指定します。
- ALL BUT (column_name_list)
- 列グループ リストに指定されていない各列に対して、自動圧縮の単一列パーティションおよびシステム決定のCOLUMN形式またはROW形式(存在する場合)が定義されるように指定します。
- NO AUTO COMPRESS
- 列パーティション テーブルの列パーティションの物理行の自動圧縮を無効にします。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_totalpriceとo_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リクエストは、Vantageがt38の各パーティション レベルに割り当てられた組み合わせパーティションの数を調整した後、テーブル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 |