ADD RANGEオプションとDROP RANGEオプションを使用したパーティションの変更 - Advanced SQL Engine - Teradata Database

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

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

一般的な規則および指針

ADD RANGEオプションとDROP RANGEオプションを使ってパーティション式に範囲を追加するか、パーティション式から範囲を削除することで、テーブル パーティションを変更する場合、次のルールとガイドラインが適用されます。文字パーティション式に適用されるその他のルールについては、テーブルと結合インデックスの変更に関するルール(データが入っている場合と入っていない場合)を参照してください。

特に指定がない限り、ここで取り上げるルールは、行パーティション テーブルと行パーティション結合インデックス、さらには列パーティション テーブルと列パーティション結合インデックスの行パーティション レベルに当てはまります。

これらのルールに基づいて実行できるのは、テーブルに既に定義されているRANGE_Nパーティション式の変更だけです。これらのオプションでテーブルのパーティション レベルの数を変更する操作やパーティション レベルを削除/追加する操作は実行できません。

ALTER TABLE … ADD RANGE[#Ln]リクエストまたはALTER TABLE … DROP RANGE[#Ln]リクエストを使用して、パーティション化と非パーティション化の間にテーブルのパーティションを変更することはできません。

現在のパーティションから以下のいずれかのパーティションに行を移動できます。
  • 新規に追加された範囲パーティション
  • NO RANGEパーティション
  • NO RANGE OR UNKNOWNパーティション

同様に、行はNO RANGEパーティションから新規に追加された範囲パーティションに移動することができます。

移動先になり得る他のパーティション(NO RANGE、NO RANGE OR UNKNOWN、新しく追加したパーティションなど)があるときに、パーティションの行を削除する必要がある場合は、パーティション式を変更する前に、DELETEリクエストを使用してテーブルからそれらの行を削除します。

範囲の追加と削除に関する一般的な指針が2つあります。
  • 削除された範囲と新しい範囲を重ねない。例えば、2つの範囲を削除して元の2つの範囲をカバーする1つの範囲を追加したり、1つの範囲を除くすべての範囲を削除した後で新しい範囲を追加して戻すことはしない。
  • DROP RANGE … WITH DELETEおよびDROP RANGE … WITH INSERT INTO save_tableは、必ずしも削除範囲の行を削除するとは限らない。

PARTITION BY句を使用したパーティションの変更

パーティション レベルの数を変更する場合や、RANGE_N関数以外の関数でも定義されているパーティション レベルを変更する場合は、行が入っていないテーブルで、PARTITION BY句を使用して対象のパーティション レベルとパーティション式を指定しなければなりません。テーブルと結合インデックスの変更に関するルール(データが入っている場合と入っていない場合)を参照してください。

パーティション レベルの数を変更したり、RANGE_N関数だけに基づくわけでもCASE_N関数だけに基づくわけでもないパーティション式を変更したりするには、ALTER TABLEリクエストでPARTITION BY句を使用して、対象のパーティション レベルと式をすべて指定し、テーブルを空にしておかなければなりません。テーブルと結合インデックスの変更に関するルール(データが入っている場合と入っていない場合)を参照。

このタイプのパーティション式は、単一レベル パーティションでのみ有効です。複数レベル パーティション式はすべて、RANGE_N関数だけに基づく式か、CASE_N関数だけに基づく式でなければなりません。その2つの関数を1つのパーティション式で組み合わせることは可能ですが、そのパーティション式の各パーティション レベルではそれぞれを1回しか指定できません。

これが不可能な場合、またはパーティションを再編成することで非常に多くの行が現在のパーティションから別のパーティションに移されるような場合は、CREATE TABLEリクエストを使用して必要なパーティションを設定した新しいテーブルを作成してから、エラー ロギングを指定したINSERT … SELECTリクエストまたはMERGEリクエストを使用して、行をソース テーブルから必要なパーティションを設定した新規作成のターゲット テーブルに移動できます。

INSERT…SELECT文およびMERGE文とそのLOGGING ERRORSオプションについての詳細は<Teradata Vantage™ - SQLデータ操作言語、B035-1146>、エラー テーブルについての詳細はCREATE ERROR TABLEを参照してください。

パーティションを変更する際は、次の規則があります。
  • プライマリ インデックスのないテーブルのパーティションを変更せずに、NO PRIMARY INDEXを指定することはできません。
  • プライマリ インデックス、基本AMPインデックス、またはパーティションのないテーブルに対し、NO PRIMARY INDEXとNOT PARTITIONEDを指定することはできません。
  • パーティション プライマリ インデックスがあり、列パーティションのないテーブルのパーティションを変更せずに、NO PRIMARY INDEXを指定することはできません。
  • パーティション プライマリ インデックスがあり、列パーティションのないテーブルに対し、DROP RANGE#n句またはADD RANGE#n句のいずれかまたは両方と一緒にNO PRIMARY INDEXを指定することはできません。
  • データが入っているパーティション テーブルのパーティションを、DROP句とADD句の任意のまたは両方を使用した新しいパーティション定義を持つように変更することはできません。これは、DROP RANGE[#Ln]句とADD RANGE[#Ln]句を使用して、新しいパーティション式を定義するときに、それらの句で、一連の範囲の最初または最後以外の範囲を削除せず、少なくとも1つの範囲を残し、結果的に最初と最後になる範囲の間に範囲を追加しない場合に限られます。

    テーブルにマルチレベル パーティションがあり、パーティション式の変更にNO RANGE [OR UNKNOWN]またはUNKNOWNのパーティションの削除が含まれている場合、そのパーティション式は、以前に変更されたことがないパーティション式でなければなりません。

    1つのレベルのパーティションの数は、1からそのレベルで定義されている最大数までの間の数にならなければなりません。

  • CASE_N関数に基づいたパーティション式のADD操作やDROP操作を実行することはできません。

    CASE_N関数に基づくパーティション式の変更には、MODIFY [PRIMARY INDEX]オプションを使用して、PARTITION BY句全体を再定義する必要があります(テーブルのプライマリ インデックス、基本AMPインデックス、またはパーティションの再定義MODIFY PRIMARY句に関する一般的なルールテーブルまたは結合インデックスのパーティションの変更、および<Teradata Vantage™ - SQLデータ定義言語-構文規則および例、B035-1144>の「ALTER TABLE」を参照)。

  • 新しいパーティション式を明示的に指定することでテーブルまたは結合インデックスの行パーティションを変更できるのは、テーブルが空の場合に限られます(テーブルと結合インデックスの変更に関するルール(データが入っている場合と入っていない場合)を参照)。

DROP RANGEの使用

次の表は、DROP RANGEを指定した場合のパーティション化に適用される条件を示しています。

状況 結果 それ以外の場合
最初の変更パーティション式で、パーティション レベル番号なしでDROP RANGEを指定する場合 DROP RANGE#Ln(nは、RANGE_Nパーティション式だけで定義する最初のパーティション レベルの番号と同じ値)の処理と同じです。 そのようなレベルがない場合、システムはリクエスト側にエラーを返します。
最初の変更パーティション式以外で、パーティション レベル番号を指定せずにDROP RANGEを指定する場合 DROP RANGE#Ln(nは、前の変更パーティション式のパーティション レベルの後でRANGE_Nパーティション式だけで指定する次のパーティション レベルの番号と同じ値)の処理と同じです。 そのようなレベルがない場合、システムはリクエスト側にエラーを返します。
最初の変更パーティション式以外で、DROP RANGE[#L n]を指定する場合 nの値は、前の変更パーティション式に関連するデフォルト レベルまたは指定レベルより1以上大きい値でなければなりません。 システムはリクエスト側にエラーを返します。
DROP RANGE#L nのデフォルト レベルまたは指定レベルを指定した場合 nの値は、テーブルで現在定義されているパーティション レベルの数以下でなければなりません。 システムはリクエスト側にエラーを返します。
範囲またはパーティションを削除する場合 必ずしも行が削除されるとは限りません。 影響を受ける行が、追加される範囲、またはオプションのNO RANGE [OR UNKNOWN]かUNKNOWNパーティションに移動される場合があります。
マルチレベルの行パーティション テーブルとマルチレベルの列パーティション テーブルの両方について、DROP RANGE WHERE partition_conditional_expressionを指定する場合

システム派生列PARTITION#L n(nの値は、1から62までの範囲で、対応するDROP RANGE[#Ln]のデフォルト レベルまたは指定レベルと同じ値)を参照する必要があります(他の列は対象外)。

システムはリクエスト側にエラーを返します。
テーブル定義で、マルチレベルの行パーティション テーブルとマルチレベルの列パーティション テーブルの両方にPARTITION#L1という名前の明示的な列を指定する場合

DROP RANGE[#Ln]句のDROP RANGE WHERE partition_conditional_expressionでPARTITION#L1を指定できません。

システムはリクエスト側にエラーを返します。
マルチレベル パーティション式でWITH DELETE句を指定する場合

少なくとも1つの変更パーティション式でDROP RANGE[#L n]を指定する必要があります。

システムはリクエスト側にエラーを返します。
シングルレベルの行パーティション テーブル定義でPARTITIONという名前の明示的な列が指定されている場合

DROP RANGE WHERE句のWHERE partition_conditional_expressionでPARTITIONを指定できません。

システムはリクエスト側にエラーを返します。
マルチレベル パーティション式でWITH INSERT句を指定する場合

少なくとも1つの変更パーティション式でDROP RANGE[#L n]を指定する必要があります。

システムはリクエスト側にエラーを返します。
シングルレベルの行パーティション テーブルで操作する場合

DROP RANGE WHERE句の条件式では、システム派生列PARTITIONまたはシステム派生列PARTITION#L1を参照する必要があります。両方を参照したり、これら以外の列を参照することはできません。

システムはリクエスト側にエラーを返します。

ADD RANGEの使用

次の表は、ADD RANGEを指定した場合のパーティション化に適用される条件を示しています。

状況 結果 それ以外の場合
変更パーティション式でDROP RANGE[#L n]式を指定するのと同じALTER TABLEリクエストでレベル指定なしのADD RANGE式を指定する場合 ADD RANGE#L n式(nの値は、そのDROP RANGE[#L n]のデフォルト レベルまたは指定レベルと同じ値)の処理と同じです。  
マルチレベル パーティション テーブルを対象にした最初の変更パーティション式で、レベルもDROP RANGE[#L n]式も指定しないでADD RANGE式を指定する場合 ADD RANGE#L n(nの値は、RANGE_Nパーティション式だけで定義する最初のパーティション レベルの番号と同じ値)の処理と同じです。 そのようなレベルがない場合、システムはリクエスト側にエラーを返します。
マルチレベル パーティション テーブルを対象にした最初の変更パーティション式以外で、レベルもDROP RANGE[#L n]式も指定しないでADD RANGE式を指定する場合 ADD RANGE式は、ADD RANGE# n(nの値は、前の変更パーティション式のパーティション レベルの後でRANGE_Nパーティション式だけで定義する次のパーティション レベルの番号と同じ値)の処理と同じです。 そのようなレベルがない場合、システムはリクエスト側にエラーを返します。
変更パーティション式でADD RANGE式とDROP RANGE[#L n]を一緒に指定する場合 ADD RANGE[#L n] (nは、そのDROP RANGE[#L n]のデフォルト レベルまたは指定レベルと同じ値)の処理と同じです。  
変更パーティション式でDROP RANGE[#L n]句と一緒にADD RANGE[#L n]句を指定する場合 nの値には、そのDROP RANGE[#L n]式のデフォルト レベルまたは指定レベルと同じレベルを指定する必要があります。 システムはリクエスト側にエラーを返します。
マルチレベル パーティション式の最初の変更パーティション式でDROP RANGE[#L n]なしでADD RANGE句を指定する場合 ADD RANGE[#L n] (nは、RANGE_Nパーティション式だけで定義する最初のパーティション レベルの番号と同じ値)の処理と同じです。 この式は、ADD RANGE[#L n] (nは、前の変更パーティション式に関連するレベルより1つ大きい値)と同じ処理になります。そのようなレベルがない場合、システムはリクエスト側にエラーを返します。
マルチレベル パーティション式の最初の変更パーティション式以外で、DROP RANGE[#L n]を指定しないでADD RANGE[#L n]式を指定する場合 nの値は、前の変更パーティション式に関連するデフォルト レベルまたは指定レベルより1以上大きい値でなければなりません。 システムはリクエスト側にエラーを返します。
マルチレベル パーティション式でADD RANGE[#L n]式を指定する場合 nの値は、テーブルで現在定義されているパーティション レベルの数以下でなければなりません。 システムはリクエスト側にエラーを返します。

DROP RANGEまたはADD RANGEの使用

DROP RANGEまたはADD RANGEを指定する場合は、次の条件が適用されます。
  • ALTER TABLE … ADD RANGE[#Ln]リクエストまたはALTER TABLE … DROP RANGE[#Ln]リクエストを使用して、パーティション化と非パーティション化の間にテーブルのパーティションを変更することはできません。
  • DROP RANGEおよびADD RANGEは、既存のパーティション式を変更し、テーブルに対して新しいパーティション式を作成します。

    Teradata Databaseは、この新しいパーティション式が満たされていない場合にのみ行を削除します。

    新しいパーティション式がNO RANGEオプションを指定する場合、行は削除されません。

  • DROP RANGE#L nまたはADD RANGE#L nを指定する場合、レベルnのパーティションは、文字データまたはグラフィック データの比較を行なわないRANGE_N関数だけを使用するパーティション式でなければなりません。そうしないと、システムはリクエスト側にエラーを返します。
  • マルチレベル パーティション式でDROP RANGE#L nまたはADD RANGE#L n式を指定する場合、レベルnのパーティションは、文字データまたはグラフィック データの比較を行なわないRANGE_N関数だけで指定するパーティション式でなければなりません。そうしないと、システムはリクエスト側にエラーを返します。
  • パーティション テーブルでレベル番号の指定なしでDROP RANGE式またはADD RANGE式を指定する場合、それらのオプションのデフォルト レベルのパーティションは、文字データまたはグラフィック データの比較を行なわない設定でなければなりません。そうしないと、システムはリクエスト側にエラーを返します。
  • マルチレベル パーティション式でレベル番号なしでDROP RANGE#L n式またはADD RANGE#L n式を指定する場合は、それらのオプションのデフォルト レベルのパーティションは、文字データまたはグラフィック データの比較を行なわない設定でなければなりません。そうしないと、システムはリクエスト側にエラーを返します。
  • マルチレベル パーティション式でDROP RANGE[#L n]またはADD RANGE[#L n]を指定する場合は、そのDROP RANGE[#L n]またはADD RANGE[#L n]のデフォルト レベルまたは指定レベルの対応するパーティション式を、文字データまたはグラフィック データの比較を行なわないRANGE_N関数のみを使用して定義する必要があります。BLOB、CLOB、BIGINTのいずれかのデータ型でその式を定義することはできません。そうしないと、システムはリクエスト側にエラーを返します。

範囲式の使用

範囲式を使用する場合は、次の規則が適用されます。
  • start_expressionまたはend_expressionに指定する各範囲は、RANGE_N関数の規則に従う必要があります(詳細については、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>を参照してください)。

    準拠すべき規則を以下にまとめます。
    • 範囲の値のデータ型は、テーブルに対応する既存のパーティション式を定義するテスト式と互換性がなければなりません。
    • 範囲は順番になっていなければならず、お互いに重なってはなりません。
    • 範囲式の順序での最後の範囲では一番後ろの範囲を指定していなければならず、その前にキーワードANDが必要です。
    • すべてのデータ型が、テスト式に対して、またはstart_expressionおよびend_expressionでサポートされていないわけではありません。詳細は、Teradata Vantage™ - SQL関数、式、および述部、B035-1145を参照してください。
  • 範囲式の順序でOR UNKNOWN句またはUNKNOWN句の任意のを指定できますが、両方を指定することはできません。

    両方を指定すると、システムはリクエスト側にエラーを返します。

  • 範囲またはパーティションを削除する場合、必ずしも行が削除されるわけではありません。影響を受ける行が、追加される範囲、またはオプションのNO RANGE [OR UNKNOWN]、[UNKNOWN]、またはUNKNOWNパーティションに移動される場合があります。
  • 1つのレベルの結果の新しいパーティション式では、少なくとも1つの範囲を定義する必要があります。そうしないと、システムはリクエスト側にエラーを返します。

    複数レベル パーティションの場合、結果の新しいパーティション式では、それぞれ少なくとも2つのパーティションを定義する必要があります。そうしないと、システムはリクエスト側にエラーを返します。

新しいパーティション式のレベル 結果
1 定義されるパーティション数は、以前に定義された最大数より少ないか等しい。
2またはそれ以上 同じパーティション数を定義する必要がある。

ALTER TABLEリクエストの使用

DROP RANGE [#Ln]式またはADD RANGE [#Ln]式の任意のまたは両方を指定するALTER TABLEリクエストの処理は、擬似BNF形式で記述した以下の汎用ALTER TABLEリクエスト構文の処理と同じです。

     ALTER TABLE table_name
       MODIFY [[[NOT] UNIQUE] PRIMARY INDEX [index_name | NOT NAMED]
       [(primary_index_column_list) | NO PRIMARY INDEX]
       PARTITION BY { new_partitioning_level
                    |(new_partitioning_level
                    {, new_partitioning_level}…) }
       [null_partition_handler];
条件
  • table_namenull_partition_handler、その他のオプションは、元のALTER TABLEリクエストのオプションと同じです。
  • null_partition_handlerは、WITH INSERT | DELETE句を参照します。
  • 新しいパーティション レベルの数は、テーブルの既存のパーティション レベルの数と同じです。
  • それぞれの新しいパーティション レベルは、以下に示す点を除き、そのレベルの既存のパーティションと同じです。
状況 結果 それ以外の場合
対象のレベルでDROP RANGE[#Ln] WHEREpartition_conditional_expressionを指定する場合 そのレベルの新しいパーティション式には、パーティション条件式の評価がTRUEになる既存の範囲またはパーティションは含まれません。  
対象のレベルでDROP RANGE[#L n] alter_rangesを指定する場合 そのレベルの新しいパーティション式には、変更範囲で指定した範囲とパーティションは含まれません。  
対象のレベルでADD RANGE[#L n] alter_rangesを指定する場合 そのレベルの新しいパーティション式には、新しい範囲およびパーティションが追加され、既存の範囲にマージされます。ただし、DROP RANGE[#L n]句を指定する場合は、その句が最初に適用されます。  
パーティションの削除や追加によって1つのレベルで定義されているパーティションの数が0に減るような場合 システムはリクエスト側にエラーを返します。  
パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をr個減らし、そのレベルでもともとADDオプションが指定されている場合 Teradata Databaseは、ADDの値をrだけ増やします。  
パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をr個減らし、そのレベルでADDオプションが指定されていない場合 Teradata Databaseは、ADD rの指定をそのレベルに追加します。  
パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をi個増やし、そのレベルで、iより大きい値でADDオプションが指定されている場合 Teradata Databaseは、ADDの値をiだけ減らします。  
パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をi個増やし、そのレベルで、iと同じ値でADDオプションが指定されている場合 Teradata Databaseは、そのレベルのADDオプションを削除します。  
パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をi個増やし、そのレベルで、iより小さい値でADDオプションが明示的に、またはデフォルトで指定されている場合 システムはリクエスト側にエラーを返します。  

パーティションの削除や追加(またはその両方)によって1つのレベルで定義されているパーティションの数をi個増やし、そのレベルではもともとADDオプションが明示的にもデフォルトでも指定されていないにもかかわらず、明示的にまたはデフォルトでADDオプションが指定されているパーティション レベルが1つ以上ある場合

システムはリクエスト側にエラーを返します。  
マルチレベル パーティション式で、パーティションの削除や追加(またはその両方)によってレベル1以外のレベルで定義されているパーティションの数をi個増やし、テーブルに行が入っている状態で、どのレベルでもADDオプションが指定されていない場合 システムはリクエスト側にエラーを返します。
この操作を実行できるのは、データの入っていないテーブルの場合に限られます。
 
新しいパーティション式を使用する場合 1つのレベルの新しいパーティション式では、少なくとも1つの範囲を指定する必要があります。 システムはリクエスト側にエラーを返します。
このエラーが発生するのは、以下のような場合です。
  • 行パーティション レベルで1つのパーティションだけが定義されている状態でADD 0を指定するか、ADDを指定しない場合

    AND

  • パーティションの最大数は最大値まで増加せず、2バイト パーティションから8バイト パーティションへも増えません。

    または

  • テーブルまたは結合インデックスがすでに8バイト パーティションの場合に、パーティションの最大数が最大値まで増加しない(組み合わせパーティションの最大数が9,223,372,036,854,775,807を超えない)場合

    AND

  • 最大数が2以上に増えない場合