テーブルのパーティション変更に関するルール - Advanced SQL Engine - Teradata Database

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

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

一般的なガイドライン

次の一般的なルールと注意点は、行パーティション テーブルのパーティションを変更する際、MODIFYオプションに適用されます。

詳細については、ADD RANGEオプションとDROP RANGEオプションを使用したパーティションの変更複数レベル パーティションのパーティション式の変更に関するルール、およびADD RANGEオプションとDROP RANGEオプションを使用したパーティションの変更を参照してください。

CREATE TABLEのパーティション プライマリ インデックスと非パーティション プライマリ インデックスも参照してください。
  • partitioning_expressionの結果のデータ型が、INTEGER、BIGINT、CHARACTERのいずれでもない場合、値は暗黙的にINTEGER型にキャストされます。

    結果の型をINTEGERにキャストできない場合、リクエスト元にエラーが返されます。

  • パーティション レベルのpartitioning_expressionでINTEGERデータ型のRANGE_N関数だけを指定する場合、その関数で定義する範囲の数は、2,147,483,647以下でなければなりません。<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>にあるRANGE_N関数の説明を参照してください。
  • パーティション レベルのpartitioning_expressionでBIGINTデータ型のRANGE_N関数だけを指定する場合、その関数で定義する範囲の数は、8バイト パーティションの場合は9,223,372,036,854,775,805以下、2バイト パーティションの場合は65,533以下でなければなりません。<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>にあるRANGE_N関数の説明を参照してください。
  • パーティション レベルの定義にRANGE_N関数またはCASE_N関数のいずれも指定しない場合、行パーティション レベルに対して定義されるパーティションの数は、RANGE_N関数またはCASE_N関数によって指定される行パーティションの数または65,535になります。

ADD句の使用

ADD句を使用する場合は、次のルールが適用されます。
  • ADD句を指定する場合、パーティション レベルのパーティションの最大数は、そのレベルで定義されているパーティションの数に、ADD句で指定するINTEGER定数の値を加算した数になります。

    この最大数が、8バイト パーティションの場合の9,223,372,036,854,775,807、または2バイト パーティションの場合の65,535を超えると、Teradata Databaseはリクエスト元にエラーを返します。

  • パーティション レベルでADD句を指定しない場合に、そのレベルがテーブルの唯一のパーティション レベルであれば、そのレベルのパーティションの最大数は、内部使用のために予約されている2つのパーティションを含めて65,534になります。
  • 列パーティション テーブルまたは結合インデックスについて次が当てはまる場合:
    • 列パーティション レベルでADD句を指定しない
    • テーブルに行パーティションもある
    • 行パーティション レベルの少なくとも1つで、ADD句が指定されていない。

    列パーティション レベルのパーティションの最大数は、定義する列パーティションの数に10を加算した数になります。この場合のデフォルトは、ADD 10です。

  • 列パーティション レベルについて次が当てはまる場合:
    • 列パーティション レベルでADD句を指定せず、テーブルに行パーティションもある。
    • すべての行パーティション レベルにADD句を指定している。
    • 列パーティションの最大数として、定義されている列パーティションの数に10を加算した数を使用すると、テーブルまたは結合インデックスが2バイト パーティションになる。

    列パーティション レベルのパーティションの最大数は、パーティションが8バイト パーティションにならずに済む最大値です。

    そうでない場合、列パーティション レベルのパーティションの最大数は、制限が9,223,372,036,854,775,807を超えない範囲の最大値になります。

    そのような大きい値がない場合、Teradata Databaseはリクエスト側にエラーを返します。

  • パーティション テーブルについて次が当てはまる場合:
    • 行パーティション レベルでADD句が指定されていない。
    • 定義されている行パーティションの数が、この行パーティション レベルと、ADD句のないそれより小さいすべての行パーティション レベルの現在の最大数になっていて、テーブルが2バイト パーティションになっている。

    各行パーティション レベルのパーティションの最大数は、パーティションが8バイト パーティションにならずに済む最大値です。

    そうでない場合、そのレベルのパーティションの最大数は、組み合わせパーティションの番号が、8バイト パーティションの場合は9,223,372,036,854,775,807、2バイト パーティションの場合は65,535を超えない範囲の最大値になります。

  • パーティション レベルでADD 0を指定すると、そのレベルのパーティションの最大数は、次の場合に定義されるパーティションの数になります。
    • 列パーティション レベルでは、ADD 10というデフォルト値を上書きして、他のレベルで定義できるパーティションの数を増やす場合にこの指定を使用できます。
    • 行パーティション レベルでは、ADD句が指定されていないより小さいレベルでさらにパーティションを増やす場合にこの指定を使用できます。
  • 行パーティション レベルのパーティションの最大数は、少なくとも2にする必要があります。

    それ以外の場合、Teradata Databaseはリクエスト側にエラーを返します。

    このエラーが発生するのは、行パーティション レベルで1つのパーティションだけが定義されている状態でADD 0を指定するか、ADDオプションを指定しないために、最大数が2以上に増えない場合です。

  • Teradata Databaseによってさらに組み合わせパーティションが追加されるパーティション レベルを以下の表にまとめます。
パーティションの種類 その他の条件 残りの組み合わせパーティションを出来るだけ多く追加する対象
シングルレベル   最初の行/列パーティション レベルと唯一の行/列パーティション レベル。

ADD値が指定されていても、Teradata Databaseによってオーバーライドされます。

マルチレベル すべての行パーティション レベルにADD句があるものの、ADD句のない列パーティション レベルがある状態 その列パーティション レベル(最初のパーティション レベルである必要はありません)。
列パーティション レベルと少なくとも1つの行パーティション レベルにADD句がない状態(ADD句が指定されている行パーティション レベルが1つもない場合も含まれる) 列パーティション レベルでデフォルトのADD 10を使用した後のADD句のない最初の行パーティション レベル。

レベル配列内のADD句のない他のすべての行パーティション レベルでこの処理が繰り返されます。

列パーティション レベルにADD句があり、少なくとも1つの行パーティション レベルにADD句がない状態 ADD句のない最初の行パーティション レベル。

レベル配列内のADD句のない他のすべての行パーティション レベルでこの処理が繰り返されます。

列パーティション レベルがなく、少なくとも1つの行パーティション レベルにADD句がない状態(ADD句が指定されている行パーティション レベルが1つもない場合も含まれる)
すべてのパーティション レベルにADD句がある状態、またはこのテーブルの次の列で定義されている残りの組み合わせパーティションを適用した後の状態 最初の行/列パーティション レベル。Teradata Databaseは、最初のパーティション レベルでADD句が指定されていても、その句をオーバーライドします。

明示的なADD句が付いているレベルが少なくとも1つある場合や、BIGINTデータ型のRANGE_N関数だけで構成されているレベルが少なくとも1つある場合、あるいは列パーティションがある場合や、パーティションが8バイトの場合は、他のそれぞれのレベル(第2レベルから最終レベルまで)でこの処理が繰り返されます。

行パーティション化

行パーティションには、次のルールが適用されます。
  • 新しいパーティション式がNO RANGEパーティションで定義されている場合、定義により、このパーティションには結果として明示的に定義されたパーティション式の値の範囲にならない行が含まれます(NO RANGEパーティションの機能の詳細は、<Teradata Vantage™ - SQL関数、式、および述部、B035-1145>のRANGE_N関数の説明を参照)。

    その結果、範囲パーティションが削除されると、そのパーティションに割り当てられていた行はすべて、NO RANGEパーティションに割り当てなければなりません。

  • 行の新しいパーティション式の評価によって評価エラー(ゼロによる除算など)が発生すると、そのテーブルまたはsave_tableに対するすべての変更がTeradata Databaseによってロールバックされ、パーティション設定は変更されません。
  • テーブルが正常に変更された時点で、新しいパーティション式がそのテーブルの有効なパーティション式になります。
  • 行パーティション テーブル、または行パーティションもある列パーティション テーブルの行の挿入または更新をその後実行しようとしたときに、その行のパーティション式が、すでにINTEGER型またはCHARACTER型として定義されていなければINTEGERにキャストされた後で、1から65,535までの範囲の値を生成しない場合、システムはその挿入操作または更新操作についてエラーを返します。
  • パーティション テーブルでアクティブな行パーティションの数が増えると、プライマリ インデックスのアクセスと結合のパフォーマンスが低下する場合もありますが、より細かな行パーティション排除が可能になります(詳細については、<Teradata Vantage™ - データベースの設計、B035-1094>を参照)。
文字行パーティションのテーブルの変更に関する一般的な使用ルールが、非文字行パーティション テーブルのルールと同じなのは、以下の場合に限られます。
  • テーブルに行がなく、新しいパーティション式を指定することによってパーティションが変更される場合。

    テーブルに行がある場合、Teradata Databaseはリクエスト元にエラーを返します。

  • テーブルに文字行パーティションがあり、文字データの比較が指定されていない行パーティション レベルが1つ以上ある場合。
    非文字行パーティション レベルの追加または削除を実行できるのは、以下の場合に限られます。
    • パーティション レベルがRANGE_N関数で定義されている場合
    • セッションの照合がテーブルまたは結合インデックスの照合と同じでなければならない場合
    • セッションのトランザクション セマンティクスがテーブルまたは結合インデックスの作成時に有効だったセマンティクスと同じ場合

    そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。

  • 文字行パーティション レベルを変更できるのは、その文字行パーティション レベルがRANGE_N関数で定義されている場合に限られます。
  • 文字行パーティション レベルを変更できるのは、NO RANGEパーティションとUNKNOWNパーティションの任意のまたは両方の追加または削除の操作を実行する場合に限られます。

セッション モードの変更については、文字パーティションの行パーティションの変更に関するルールも参照してください。

CASE_Nの使用

ALTER TABLE文で作成された文字行パーティション テーブルでCASE_Nパーティション式を使用する場合の使用ルールは、非文字行パーティション テーブルの使用ルールと同じですが、次の例外があります。
  • ALTER TABLE … MODIFY … PARTITION BY文を使って、テーブルの文字ベースの行パーティションを変更するには、テーブルは空である必要があります。

    これは、パーティション式で1つ以上の文字行パーティション レベルも指定する行パーティション テーブルおよび列パーティション テーブルに適用されます。

  • 新しいパーティション式の対象が文字行パーティション テーブルの場合、ALTER TABLE文の実行時に有効だったセッションの照合は変更後のテーブルの照合になります。
  • CASE_N式でADD RANGE句またはDROP RANGE句を使用して、文字行パーティションのテーブルのパーティション設定を変更することはできません。

セッションのデフォルト、またはテーブル作成時のCREATE TABLE文で明示的に指定されているCAST式に基づいて、文字列の参照とリテラルの大文字/小文字の区別が決定されます。これは比較の評価にも影響します。

列を明示的にCASESPECIFICまたはNOT CASESPECIFICに割り当てることもできます。また、これらの修飾子を持つCAST定数式にすることも可能です。

セッション モード Teradata Databaseが使用する大文字/小文字の区別に関するデフォルト設定
ANSI CASESPECIFIC
Teradata NOT CASESPECIFIC
CASE_Nのパーティション式では、UPPERCASE列属性と以下の関数を指定できます。
  • CHAR2HEXINT
  • INDEX
  • LOWER
  • MINDEX
  • POSITION
  • TRANSLATE
  • TRANSLATE_CHK
  • TRIM
  • UPPER
  • VARGRAPHIC