パーティションの変更には次のルールと制約事項が適用されます。
- 2バイト パーティションのテーブルを8バイト パーティションに変更することはできません。
- 8バイト パーティションのテーブルを2バイト パーティションに変更することはできません。組み合わせパーティションの数が65,536未満に減る場合でも、このルールに変わりはありません。
- PARTITIONED BYもNOT PARTITIONEDも指定しない場合、Teradata Databaseは、指定したテーブルのパーティションを変更しません。
- セカンダリ インデックスやハッシュ インデックスをパーティション化することはできません。
- ALTER TABLE文の対象になるテーブルにデータが入っていてもかまわない場合は、変更後のテーブルと新しいパーティションが、MODIFY PRIMARYオプションとMODIFY NO PRIMARYオプションで定義されている条件を満たすようにしなければなりません。ただし、8バイト パーティションが8バイト パーティションのままになること(組み合わせパーティションの数が65,536未満に減る場合も含む)と、2バイト パーティションが2バイト パーティションのままになることは例外です。テーブルと結合インデックスの変更に関するルール(データが入っている場合と入っていない場合)を参照してください。
新しいパーティション定義で、2バイト パーティション テーブルの組み合わせパーティションの数が最大数の65,535を超える場合、対象のテーブルは、データの入っていないテーブルでなければならず、前の段落で取り上げたルールは当てはまりません。この場合、データの入っていないテーブルの新しいパーティションは、8バイト パーティションになります。
- ALTER TABLEリクエストでセカンダリ インデックスを指定し、その後にカンマを入れて、さらにその後にPARTITION BY句を続ける場合、そのPARTITION BY句は、セカンダリ インデックスなしテーブルに適用されます。
- インデックス リストの中で最後の項目としてPARTITION BY句を指定するのではなく単独で指定する場合は、PARTITION BY句の後にカンマを入れる必要があります。
- インデックス リストでPARTITION BY句を単独で複数回指定することはできません。
- インデックス リストでPARTITION BY句を単独で指定する場合は、NO PRIMARYまたはPRIMARY AMPのインデックス定義でその句を指定できません。
- 1つのPARTITION BY句でCOLUMNパーティション レベルを複数回指定することはできません。
- Teradata Databaseは、暗黙的にパーティション式を以下のように書き直します。
- タイムゾーンのリテラルがないTIME(n)は、TIME(n) WITH TIME ZONEリテラルに変更されます。これは、現在のセッションのタイムゾーン変位が存在する場合はそれを含めることによって、または現在のセッションに基づくタイムゾーン文字列、リテラルのローカル値、およびUTCのCURRENT_DATE(つまり+00:00のタイムゾーン)のタイムゾーン変位を含めることによって実行されます。
- タイムゾーンのリテラルがないTIMESTAMP(n)は、TIMESTAMP(n)WITH TIME ZONEリテラルに変更されます。これは、現在のセッションのタイムゾーン変位が存在する場合はそれを含めることによって、または、現在のセッションのタイムゾーン文字列、およびリテラルのローカル値に基づいたタイムゾーン変位を含めることによって実行されます。
- AT LOCAL句は、文字リテラルを指定するAT単純式の句に変更されます。
現在のセッションのタイムゾーンがタイムゾーン変位である場合は、文字リテラルは、プラスの場合は'+hh:mm'という形式で、マイナスの場合は'-hh:mm'とうい形式の文字リテラルのように、現在のセッションのタイムゾーン変位となります。現在のセッションのタイムゾーンがタイムゾーン文字列の場合は、文字リテラルは、現在のセッションのタイムゾーン文字列になります。
- AT句を使用しないCURRENT_DATEまたはDATEの場合は、定義されている現在日付は、現在のセッションのタイムゾーンのものとして解釈されます。
AT [TIME ZONE]単純式の句を使用するCURRENT_DATEまたはDATEの場合、現在日付は、指定されたタイムゾーンのものとして解釈されます。
- テーブル内の行または列に対する新しいパーティション式の評価によって、(ゼロで除算されているなどの)評価エラーが発生した場合、そのテーブルへの変更(および保存テーブルがある場合は、保存テーブルへの変更)がロールバックされ、パーティション式は変更されません。
- あるレベルに対する新しいパーティション式は、変更が成功した後に、そのレベルのパーティション式になります。
行パーティション テーブルの行または列に対し、それ以降に挿入または更新を試みた結果として、その行または列のパーティション式の値が、1と、そのレベルで定義されているパーティション数との間の数にならなくなる場合は、その挿入または更新でエラーが発生します。
- テーブルまたは結合インデックスに列パーティションと行パーティションの両方がある場合、データの入っているテーブルまたは結合インデックスの行パーティションを変更すると、パフォーマンスに影響が出ます。テーブルの行を行パーティション間で移動する操作には、大きなコストがかかる可能性があるからです。
- トリガーが定義されているテーブルの変更や再検証を行なうALTER TABLEリクエストを実行するには、以下の表のとおり、まずそのトリガーを無効にしなければなりません。
ALTER TABLEリクエストが行パーティションを変更または再検証するときに含めるオプション 無効にするトリガー WITH DELETE table_nameのすべてのDELETEトリガー。 ALTER TABLEリクエストが完了したら、使用不可にしたトリガーを再び使用可能にできます。
WITH INSERT - table_nameのすべてのDELETEトリガー。
- save_tableのすべてのINSERTトリガー。
ALTER TABLEリクエストが完了したら、使用不可にしたトリガーを再び使用可能にできます。
MODIFY PRIMARY句、MODIFY NO PRIMARY句、PARTITIONED BY句には、次の一般的なルールが適用されます。
- MODIFY PRIMARYまたはMODIFY NO PRIMARY指定せずにPARTITION BY句を指定した場合、 PRIMARY KEYまたはUNIQUE制約を指定しても、DBS制御フィールドであるPrimaryIndexDefaultの設定に関係なく、デフォルトはNO PRIMARY INDEXになります。DBS制御およびPrimaryIndexDefaultフィールドの詳細については、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
- MODIFY PRIMARY、MODIFY NO PRIMARY、またはPARTITION BY句を指定しない場合、テーブルまたは結合インデックスのデフォルトのプライマリ インデックス、基本AMPインデックス、またはデフォルトのMODIFY NO PRIMARYは、DBS制御フィールドのPrimaryIndexDefaultの設定によって決定されます。DBS制御のPrimaryIndexDefaultフィールドの詳細については、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
システム派生列PARTITIONとPARTITION#L nに関するルールを以下にまとめます。
- 新しいパーティション式の定義では、システム派生列PARTITIONまたはPARTITION#L n,をいかなる形式でも指定することはできません(nは、2バイト パーティションの場合は1から15までの範囲の値、8バイト パーティションの場合は1から62までの範囲の値になります)。
- テーブルまたは結合インデックスのパーティションを変更すると、テーブルまたは結合インデックスの(すべてではないものの)ほとんどの行で、システム派生列PARTITIONとPARTITION#L nの値に影響が出ます。
NOT PARTITIONED句に関するルールを以下にまとめます。
- NOT PARTITIONEDを指定する場合に、既存のテーブルまたは結合インデックスがパーティション化されていると、そのテーブルまたは結合インデックスに行が入っていなければ、そのパーティションがなくなります。
テーブルまたは結合インデックスにデータが入っている場合は、リクエスト元にエラーが返されます。
- NOT PARTITIONEDを指定する場合に、既存のテーブルまたは結合インデックスに非パーティション プライマリ インデックスがあると、Teradata Databaseは、そのプライマリ インデックスのパーティション設定を変更しません。
- PARTITIONED BYもNOT PARTITIONEDも指定しなければ、プライマリ インデックスのパーティション設定は変更されません。