すべてのプロダクト
Search
ドキュメントセンター

PolarDB:範囲分割を使用する場合

最終更新日:May 30, 2024

範囲分割は、履歴データにとって便利な方法である。 範囲分割では、境界値を使用して、テーブルまたはインデックス内のパーティションの範囲と順序を定義します。

範囲分割は通常、DATE型の列の時間間隔でデータを整理するために使用されます。 したがって、範囲パーティションにアクセスするほとんどのSQL文は、時間範囲に重点を置いています。 次の例は、特定の期間内のデータを選択するSQL文に似たシナリオです。 各パーティションが1か月のデータを表す場合、21-12データのクエリは12月2021日のパーティションにアクセスする必要があります。 利用可能な全データの一部のみが走査される。 この最適化方法は、パーティションプルーニングと呼ばれます。

範囲分割は、新しいデータが読み込まれ、古いデータが定期的にクリアされるシナリオにも最適です。 たとえば、タンブリングウィンドウは通常、過去36か月のデータを照会するために保持されます。 範囲分割は、このプロセスを単純化する。 新しい月のデータを追加するには、別のテーブルにデータをロードしてクリアし、インデックスを作成してから、EXCHANGE PARTITIONステートメントを実行して、元のテーブルを照会できるように、レンジパーティションテーブルに追加する必要があります。 新しいパーティションを追加したら、DROP partitionステートメントを実行して、先月のパーティションを削除できます。

次の場合、範囲パーティション分割を使用できます。
  • 一部の列は、注文テーブルorderや購入スケジュールLINEITEMなど、非常に大きなテーブルの範囲でスキャンされることがよくあります。パーティションプルーニングは、これらの列のテーブルをパーティショニングすることによって実装できます。
  • タンブリングウィンドウが維持される。
  • 大きなテーブルのバックアップや復元などの管理操作は、指定された時間範囲内に完了できませんが、大きなテーブルは範囲ごとに小さな論理ブロックに分割できます。
例: 9年を超える注文テーブルを作成し、o_orderdate列に基づいて範囲別にパーティション分割します。 データを8年に分割し、毎年1つのパーティションを使用します。 パーティションプルーニングを使用して、短い間隔で販売データを分析できます。 タンブリングウィンドウメソッドがサポートされています。
テーブルの「注文」を作成 (
  'o_orderkey' int(11) NOT NULL、
  'o_custkey' int(11) NOT NULL、
  'o_orderstatus' char(1) DEFAULT NULL、
  'o_totalprice' decimal(10,2) DEFAULT NULL、
  'o_orderDATE' 日付NOT NULL、
  'o_orderpriority' char(15) DEFAULT NULL、
  'o_clerk' char(15) DEFAULT NULL、
  'o_shippriority' int(11) デフォルトNULL、
  'o_comment' varchar(79) DEFAULT NULL、
  プライマリキー ('o_orderkey' 、'o_orderDATE' 、'o_custkey') 、
  KEY 'o_orderkey' ('o_orderkey') 、
  KEY 'i_o_custkey ' ('o_custkey') 、
  KEY 'i_o_orderdate ' ('o_orderDATE')
) エンジン=InnoDB
範囲によるパーティー (TO_DAYS(o_orderdate))
(PARTITION item1はより少ない値 (TO_DAYS('1992-01-01 '))) 、
 PARTITION item2はより少ない値 (TO_DAYS('1993-01-01 ')) 、
 PARTITION item3よりも少ない値 (TO_DAYS('1994-01-01 ')) 、
 PARTITION item4値より少ない (TO_DAYS('1995-01-01 ')) 、
 PARTITION item5値より少ない (TO_DAYS('1996-01-01 ')) 、
 PARTITION item6値より少ない (TO_DAYS('1997-01-01 ')) 、
 PARTITION item7値より少ない (TO_DAYS('1998-01-01 ')) 、
 PARTITION item8値より少ない (TO_DAYS('1999-01-01 ')) 、
 PARTITION item9値より少ない (最大値);

 EXPLAIn select * from order where o_orderDATE = '1992-03-01 ';
---- ----------- -------------------------------------------------------------------------------------
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---- ----------- -------------------------------------------------------------------------------------
| 1 | SIMPLE | orders | item2 | ref | i_o_orderdate | i_o_orderdate | 3 | const | 1 | 100.00 | NULL |
---- ----------- -------------------------------------------------------------------------------------------------------------------
RANGE型の制限により、TO_DAYS() を使用してテーブルを分割し、SHOW CREATE tableステートメントを実行した後、元のDDLステートメントが表示されない場合があります。 例:
テーブル注文の作成を表示します。| 注文 | テーブル 'orders' を作成する (
  'o_orderkey' int(11) NOT NULL、
  'o_custkey' int(11) NOT NULL、
  'o_orderstatus' char(1) DEFAULT NULL、
  'o_totalprice' decimal(10,2) DEFAULT NULL、
  'o_orderDATE' 日付NOT NULL、
  'o_orderpriority' char(15) DEFAULT NULL、
  'o_clerk' char(15) DEFAULT NULL、
  'o_shippriority' int(11) デフォルトNULL、
  'o_comment' varchar(79) DEFAULT NULL、
  プライマリキー ('o_orderkey' 、'o_orderDATE' 、'o_custkey') 、
  KEY 'o_orderkey' ('o_orderkey') 、
  KEY 'i_o_custkey ' ('o_custkey') 、
  KEY 'i_o_orderdate ' ('o_orderDATE')
) エンジン=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY RANGE (to_days('o_orderDATE'))
(PARTITION item1の値は (727563) よりも低く、
 PARTITION item2値より少ない (727929) 、
 PARTITION item3の値は (728294) よりも少なく、
 PARTITION item4の値は (728659) 未満、
 PARTITION item5値がより少ない (729024) 、
 PARTITION item6値がより少ない (729390) 、
 PARTITION item7値は (729755) よりも少なく、
 PARTITION item8値がより少ない (730120) 、
 PARTITION item9値は最大値よりも少ない */ | 

範囲列分割は、範囲分割の拡張です。 範囲分割のために複数の列値が定義される。 整数以外の列をパーティションキー列として選択できます。

範囲列のパーティション分割は、次の点で範囲のパーティション分割と異なります。
  • RANGE COLUMNS() では、式ではなく列名のみを指定できます。
  • RANGE COLUMNS() は、1つ以上のカラムを含むことができる。 範囲列分割は、スカラー値の代わりにタプルを比較します。 範囲列分割における行位置も、タプル間の比較に基づく。
  • 範囲列パーティション分割では、パーティションキー列はINTEGER、STRING、DATE、およびDATETIME型にすることができます。
範囲列のパーティション分割テーブルを作成する:

  'o_orderkey' int(11) NOT NULL、
  'o_custkey' int(11) NOT NULL、
  'o_orderstatus' char(1) DEFAULT NULL、
  'o_totalprice' decimal(10,2) DEFAULT NULL、
  'o_orderDATE' 日付NOT NULL、
  'o_orderpriority' char(15) DEFAULT NULL、
  'o_clerk' char(15) DEFAULT NULL、
  'o_shippriority' int(11) デフォルトNULL、
  'o_comment' varchar(79) DEFAULT NULL、
  プライマリキー ('o_orderkey' 、'o_orderDATE' 、'o_custkey') 、
  KEY 'o_orderkey' ('o_orderkey') 、
  KEY 'i_o_custkey ' ('o_custkey') 、
  KEY 'i_o_orderdate ' ('o_orderDATE')
) エンジン=InnoDB
RANGE COLUMNSによるパーティー (o_orderdate)
(PARTITION item1はより少ない値 ('1992-01-01 ') 、
 PARTITION item2はより少ない値 ('1993-01-01 ') 、
 PARTITION item3は ('1994-01-01 ') よりも少ない値を示し、
 PARTITION item4値はより少ない ('1995-01-01 ') 、
 PARTITION item5値はより少ない ('1996-01-01 ') 、
 PARTITION item6値はより少ない ('1997-01-01 ') 、
 PARTITION item7はより少ない値 ('1998-01-01 ') 、
 PARTITION item8値より少ない ('1999-01-01 ') 、
 PARTITION item9値未満 (最大値);