- 以下の説明がすべて正確である場合、列パーティション化およびオプションで行パーティション化と組み合わせた列パーティション化だけを結合インデックスに指定できます。
- 結合インデックスが単一テーブルに定義されている。
複数テーブルのインデックスにすることができない。
- 結合インデックスが非集約インデックスである。
- 結合インデックスが行圧縮されていない。
- 結合インデックスが単一テーブルに定義されている。
- PARTITION BY句でCOLUMNオプションを指定すると、その結合インデックスは定義上、列パーティション結合インデックスになります。
- NO PRIMARY INDEXまたはPRIMARY AMP INDEXを指定する場合は、PARTITION BY句も指定する必要があり、パーティションにはCOLUMNパーティション化レベルを指定する必要があります。
- COLUMN句で列グループを指定しない場合、Teradata Databaseは、CREATE JOIN INDEXリクエストで指定された列および列グループごとに別個の列パーティションを定義します。
- 選択リストで実行される列または制約グループを指定できるのは、PARTITION BY句でCOLUMNパーティション化も同時に指定する場合だけです。列パーティションされていない結合インデックスの選択リストの中で、列や制約をグループ化することはできません。
- 同じCREATE JOIN INDEXリクエストの選択リスト、およびPARTITION BY句のCOLUMNオプションの両方で列または制約のグループ化を指定することはできません。
- 列定義の中で1つの列を2回以上指定することはできません。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
- 1つの列を複数の列パーティションで指定することはできません。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
- 1つの列パーティション レベルに対して定義される列パーティションの数は、ユーザーが指定した列パーティションの数に、内部使用のために予約済みの2つの列パーティションを加算した数になります。
Teradata Databaseは、予約済みの1つのパーティションを、削除された行を示すためのスパース ビット マップとして使用します。もう1つのパーティションは、将来の使用のために予約されています。列パーティションに割り当てられていない列パーティションが、常時、少なくとも1つ存在します。
- 行パーティション レベルに対して定義されるパーティション数は、PARTITION BY句でユーザーが定義する行パーティションの数になります。
PARTITION BY句のRANGE_N関数またはCASE_N関数をユーザーが指定しない場合、Teradata Databaseは65,535個の行パーティションを結合インデックスに対して使用します。
- 行パーティション レベルの場合、最大パーティション番号は、そのレベルのパーティションの最大数と同じです。
- 列パーティション レベルの場合、最大パーティション番号は、そのレベルの列パーティションの最大数より大きくなります。
このため、列パーティションを変更する時に利用可能な未使用の列パーティション番号が、常時、少なくとも1つ確保されます。
- レベル順でADDオプションを指定しない行パーティション レベルごとに、この行パーティション レベルおよびADD句が指定されていない低い行パーティション レベルを使用する場合、パーティションは2バイト パーティションになり、行パーティション レベルのパーティションの最大数は、パーティションが8バイト パーティションにならないようにする最大値です。
それ以外の場合、このレベルの最大パーティション数は、9,223,372,036,854,775,807を超えない最大値です。そのような大きい値がない場合、Teradata Databaseはリクエスト側にエラーを返します。
- ADD 0を指定すると、パーティション レベルについて、そのレベルの最大パーティション数が、定義されているパーティション数と同じであることを明示的に指定できます。
これが役立つのは、あるパーティション レベルについてデフォルトのADD 10を上書きして、他のレベルのパーティション数を増やす場合です。
また、ADD句を指定しないで超過分のパーティションを割り当てないことにより、行パーティション レベルのパーティション数を低くしたい場合にも役立ちます。
- 行パーティション レベルのパーティションの最大数は少なくとも2でなければなりません。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
このエラーが起こるのは、行パーティション レベルに1つのパーティションだけを定義した場合に、同時にADD 0を指定したとき、またはADDオプションを指定して最大数が少なくとも2になるように増やないときです。
- あるパーティション レベルの最大パーティション数として、そのレベルで定義されているパーティション数より大きい数を指定しておくと、そのレベルで定義するパーティション数をALTER TABLEリクエストを使用して増やすことができます。これは、ALTER TABLEリクエストを使用して、あるレベルのパーティションの最大数を増やすことができるという意味ではありません。
- CASE_N関数を1つだけ使用してパーティション式を定義する場合、定義するパーティションの数は2,147,483,647以下にする必要があります。CASE_N関数はINTEGERデータ型だからです。(それ以外の場合、既存のエラー5715が発生します)。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
- INTEGERデータ型のRANGE_N関数を1つだけ使用して単一レベル パーティションのパーティション式を定義する場合、定義するパーティションの合計数は2,147,483,647以下にする必要があります。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
2バイトの単一レベル パーティションの場合、RANGE_N関数で65,533個の範囲を超えるパーティションを定義することはできません。定義により、それより広い範囲を使用するには、8バイトのパーティション化が必要になるからです。
NO RANGEパーティションとUNKNOWNパーティションの両方を定義した場合、定義できるパーティションの合計数は65,535までです。
- BIGINTデータ型のRANGE_N関数を1つだけ使用してパーティション式を定義する場合、定義する範囲の数は9,223,372,036,854,775,805以下にする必要があります。
そうでない場合、Teradata Databaseはリクエスト側にエラーを返します。
単一レベル パーティションでは、NO RANGEパーティションとUNKNOWNパーティションの両方を定義した場合、定義できるパーティションの合計数は9,223,372,036,854,775,807までです。
- 行パーティション レベルに定義されるパーティションの数は、RANGE_N関数またはCASE_N関数で指定した行パーティションの数になり、RANGE_N関数とCASE_N関数のどちらも指定しない場合は65,535になります。
- パーティション レベルには、ADDオプションを指定できます。ADDキーワードの後に指定するBIGINT数に、そのレベルに定義するパーティション数を加算した数が、そのレベルに定義できるパーティションの最大数になります。
この最大値が9,223,372,036,854,775,807を超えると、Teradata Databaseはリクエスト元にエラーを返します。
単一レベル パーティションでは、組み合わせパーティションの最大数は、そのパーティション レベルの最大パーティション数と同じです。
ADDオプションを使用すると、ALTER TABLEリクエストを使用して、そのレベルのパーティション数をこの最大数まで増やすことができます。
- 列パーティション レベルにADDオプションを指定しておらず、そのレベルだけがパーティション レベルの場合、パーティションの最大数は、内部使用のための2つを含めて、65,534です。
- 列パーティション レベルにADDオプションを指定しておらず、以下にリストした項目も当てはまる場合には、パーティションは行ヘッダー内に2バイトを使用して格納され、列パーティション レベルの最大パーティション数は、定義されている列パーティション数に10を加算した数になります。つまり、このケースのデフォルト数は10です。
- 行パーティションが存在する
- 行パーティション レベルの少なくとも1つで、ADDオプションが指定されていない
列パーティション レベルの最大パーティション数は、8バイトのパーティションを使用しないで済む最大値です。それ以外の場合、列パーティション レベルの最大パーティション数は、9,223,372,036, 854,775,807を超えない最大値です。
単一レベル パーティションでは、組み合わせパーティションの最大数は、このパーティション レベルの最大パーティション数と同じです。
- 1つの結合インデックスの組み合わせパーティション数は、各パーティション レベルで定義されたパーティション数の積です。
- 1つの結合インデックスの組み合わせパーティションの最大数は、各パーティション レベルで定義された最大パーティション数の積です。
単一レベル パーティションでは、組み合わせパーティションの最大数は、そのパーティション レベルの最大パーティション数と同じです。
列パーティションがある場合、組み合わせパーティションの最大数は、組み合わせパーティションの最大数より小さくなります。それ以外の場合は、同じです。
- 組み合わせパーティションの最大数が65,535より大きい場合、Teradata Databaseはパーティション番号を行ヘッダーの8バイトのフィールドに格納します。これを、8バイト パーティションと呼びます。
組み合わせパーティションの最大数が65,535以下の場合、Teradata Databaseはパーティションを行ヘッダーの2バイトのフィールドに格納します。これを、2バイト パーティションと呼びます。
ADDオプションなしのシングルレベル 列パーティションは、2バイト フィールドに格納されます。
- 1つの結合インデックスの組み合わせパーティションの最大数は、各パーティション レベルに定義されたパーティションの最大数の積です。
最大値は9,223,372,036,854,775,807を超えてはなりません。
単一レベル パーティションでは、組み合わせパーティションの最大数は、このパーティション レベルの最大パーティション数です。
- 2バイト パーティションの場合、最初のレベルのパーティションの最大数は、組み合わせパーティションの最大数が65,535を超えない範囲での最大数になります。他のレベルがある場合には、これが2番目のレベルから最後のレベルまで各レベルについて反復されます。
- 2バイト パーティションの場合、パーティション レベルの最大数は15です。
- 8バイト パーティションの場合、最初のレベルのパーティションの最大数は、組み合わせパーティションの最大数が9,223,372,036,854,775,807を超えない範囲での最大数になります。他のレベルがある場合には、これが2番目のレベルから最後のレベルまで各レベルについて反復されます。
- 8バイト パーティションの場合、パーティション レベルの最大数は62です。
1つ以上のレベルで最大列パーティション数が2より大きい場合、パーティション レベルの数はさらに制限を受けます。各レベルでの最大組み合わせパーティション数の積が9,223,372,036,854,775,807を超えてはならないというルールによる制限があるからです。
- Teradata Databaseは、列パーティション結合インデックスのパーティション レベル定義からパーティション制約を取得します。
このパーティション化制約のテキストは、16,000文字以内にする必要があります。この範囲を超えると、Teradata Databaseはリクエスト元にエラーを返します。
このルールには、次の定義が適用されます。
変数 定義 cs ユーザーが指定した列パーティションの数 cm 列パーティション レベルの最大パーティション数 Teradata Databaseは最初に、ユーザー指定の列パーティションに1から1ずつ増加する番号(最大はcs)を割り当てます。
Teradata Databaseは、内部パーティションにパーティション番号cm-1を割り当て、削除列内部パーティションにパーティション番号cmを割り当てます。
最初は、列パーティション番号cs+1からcm-2までに割り当てられる列パーティションはありません。cm-cs-2は0より大きいので、最初は少なくとも1つの列パーティション番号が未使用です。
パーティションを削除または変更すると、番号に空きができていきます。列パーティションを追加または変更した場合、1つの列パーティション番号が未使用のままである限り、1からcm-2までの間の未使用の列パーティション番号を、新しく追加あるいは変更された列パーティションに割り当てることができます。これが必要なのは、ALTER TABLEで列パーティションを変更するには、少なくとも1つの列パーティション番号が利用可能でなければならないからです。
Teradata Databaseは、列パーティション番号を使用して、結合インデックスの行の列パーティション値に対する組み合わせパーティション番号を算出します。その点を除けば、列パーティションに割り当てられる列パーティション番号に特に意味はありません。
- 結合インデックスがパーティション化されている場合、そのフォールバック行は、その基本データ行と同じようにパーティション化されます。
基本データ行にプライマリ インデックスが付いている場合は、フォールバック データ行にも同じプライマリ インデックスが付きます。
基本データ行にプライマリ インデックスが含まれていない場合は、フォールバック データ行にも プライマリ インデックスが含まれません。
超過したパーティションがどのパーティション レベルに追加されるかを次の表にまとめます。
パーティションの種類 その他の条件 Teradata Databaseが残りの組み合わせパーティションをできるだけ多く追加する対象 シングルレベル 唯一の行または列パーティション レベル。 ADD句を指定した場合、Teradata Databaseはそれを上書きします。
マルチレベル すべての行パーティション レベルにADD句が指定されているが、ADD句を指定されていない列パーティション レベルがある。 列パーティション レベル。 最初のパーティション レベルにはこれを追加する必要がありません。
列パーティション レベルと少なくとも1つの行パーティション レベルにADD句がない状態(ADD句が指定されている行パーティション レベルが1つもない場合も含まれる) 列パーティション レベルでデフォルトのADD 10を使用した後のADD句のない最初の行パーティション レベル。 ADD句を指定されていない行パーティション レベルが他にもある場合は、各行パーティション レベルについてレベル順にこれを繰り返します。
列パーティション レベルにADD句があり、少なくとも1つの行パーティション レベルにADD句がない状態 ADD句のない最初の行パーティション レベル。 ADD句を指定されていない行パーティション レベルが他にもある場合は、各行パーティション レベルについてレベル順にこれを繰り返します。
列パーティション レベルが存在せず、少なくとも1つの行パーティション レベルにADD句が含まれていない。 どの行パーティション レベルにもADD句が指定されていない場合を含みます。
ADD句のない最初の行パーティション レベル。 すべてのパーティション レベルにADD句が含まれているか、残りの組み合わせパーティションがすでに適用されている。 最初の行または列パーティション レベル。最初のパーティション レベルにADD句が指定されている場合、その指定は上書きされます。 Teradata Databaseは、他にレベルがあれば、2番目のレベルから最後のレベルまで、各レベルについてこれを繰り返します。
列パーティションでは、さなざまなパーティション式や列グループ化を定義できるので、組み合わせパーティションの数もさまざまです。特定のパーティションを定義することに意味があるかどうか、パフォーマンスと記憶装置にどんな影響があるかを検討する必要があります。
パフォーマンスの考慮事項については、列パーティション テーブルのパフォーマンスに関する問題を参照してください。
PARTITION BY句のCOLUMNオプションの中で列のグループ化を指定すると、どの列がどのパーティションに所属するかを柔軟に指定できると同時に、列リストでの表示順序も指定できます。
選択リストの中で列をグループ化するほうが単純な指定方法ではありますが、柔軟性が劣ります。
- 列パーティション値は、特定の結合インデックスの物理行の列パーティションに含まれている各列の値で構成されます。
- PARTITION BY句のCOLUMN指定に列グループ句を指定する場合は、グループ化列に指定されている列は、結合インデックスの選択リストで定義されている必要があります。
- PARTITION BY句のCOLUMN指定に列グループ句を指定すると、Teradata Databaseはその列グループ句で指定されている列パーティションを定義します。
- COLUMN形式の列リストで列または制約グループ(あるいはその両方)を指定する場合、グループ化によって列パーティションが定義されます。Teradata Databaseは、COLUMN形式を使用して1つの物理コンテナに1つ以上の列パーティション値を格納します。
ROW形式の列リストで列または制約グループ(あるいはその両方)を指定する場合、グループ化によって列パーティションが定義され、ROW形式を使用して物理的な副行に1つだけの列パーティション値が格納されます。
列または制約グループに対してCOLUMN形式とROW形式のどちらも指定しない場合、グループ化によって列パーティションが定義され、列パーティションに対してCOLUMN形式とROW形式のどちらを使用するかをTeradata Databaseが決めます。
- AUTO COMPRESSまたはNO AUTO COMPRESSのいずれかを、列パーティションのデフォルトとして指定できます。いずれも明示的に指定しない場合、AUTO COMPRESSがデフォルトに設定されます。
- 列リストでAUTO COMPRESSまたはNO AUTO COMPRESSを使用して列または制約グループ(あるいはその両方)を指定すると、Teradata Databaseは指定の物理行に対して適切な自動圧縮を適用し、ユーザー指定の圧縮がある場合はそれを列パーティションに適用します。
さらに、Teradata Databaseは、COLUMN形式の列パーティションに行ヘッダー圧縮を適用します。
AUTO COMPRESSとNO AUTO COMPRESSのどちらも指定しなければ、Teradata Databaseは、PARTITION BY句でCOLUMNに明示的に指定するデフォルトを使用します。
COLUMNにデフォルトを定義していない場合、Teradata Databaseは、AUTO COMPRESSを使用します。
- CREATE JOIN INDEXリクエストでPRIMARY INDEX(column_list)とNO PRIMARY INDEXをどちらも明示的に指定しない場合に、PARTITION BY句を指定すると、DBS制御フラグPrimaryIndexDefaultの設定に関係なく、Teradata Databaseはプライマリ インデックスのない結合インデックスを作成します。詳細と例外については、Teradata Vantage™ - データベースの設計、B035-1094およびTeradata Vantage™ - データベース ユーティリティ、B035-1102を参照してください。
- PARTITION BY句のパーティション レベルであるCOLUMNオプションが列グループ化と括弧で区切られた列定義または制約定義(グループを定義する)のどちらも指定しない場合、Teradata Databaseは、指定された個別の列を単一の要素グループとして処理し、単一の列パーティションをAUTO COMPRESSおよびシステム設定のCOLUMN形式またはROW形式で定義します。
- 単一列の列パーティションに対してCOLUMNまたはROWの列パーティション形式を指定したり、NO AUTO COMPRESSを指定したりするには、列定義または制約定義を括弧で区切ることにより、それを単一列グループとして示します。
定義を括弧で区切ることにより、1つ以上の列定義または制約定義を1つの列パーティションにグループ化できます。
同じ結果を得る別の方法として、PARTITION BY句の中のCOLUMN句に同じオプションとグループ化を指定することもできます。
- 列パーティション化の形式は、COLUMNかROWのいずれかになります。同じ列パーティション内で形式を混在させることはできません。
ただし、列パーティション結合インデックスの各列パーティションを別々の形式にすることはできますです。たとえば、列パーティション結合インデックスの列パーティションは、すべてをCOLUMN形式に設定(およびコンテナに格納)したり、すべてをROW形式に設定(および副行に格納)したりできるほか、一部のパーティションにCOLUMN形式を適用し、その他のパーティションにROW形式を適用するということも可能です。
- CREATE TABLE … ASリクエストの列リストでは、ターゲット テーブルにソース テーブルとは異なる列のグループ化を指定できます。ここに記載されているルールも適用されます。
結合インデックスのPARTITION BY句におけるCOLUMNパーティション
- PRIMARY INDEX、PRIMARY AMP INDEX、またはNO PRIMARY INDEX句を指定できます。
- UNIQUE PRIMARY INDEX句を指定することはできません。
- PRIMARY INDEX、PRIMARY AMP INDEX、またはNO PRIMARY INDEX句を指定しない場合、DBS制御フィールドPrimaryIndexDefaultの設定に関係なく、デフォルトはNO PRIMARY INDEXです。
- ORDER BY句は指定できません。
- スパース結合インデックスに列パーティション化を定義することができます。
- 列パーティション結合インデックスを作成するために使用されるCREATE JOIN INDEXリクエストの選択リストで、システム派生列ROWIDに別名を指定する必要があります。
PARTITION BY句のCOLUMN句で指定された列グループ句で、ROWIDに指定した別名を使用できます。
- 列名ではない結合インデックス定義の選択リスト内の式はすべて、別名で指定されている必要があります。
- 結合インデックス定義の選択リストで指定されている列には、サーバー文字セットCHARACTER SET KANJI1を含めることはできません。
代わりにサーバー文字セットをCHARACTER SET UNICODEに変更する必要があります。
COLUMNオプションへの列グループ化の指定
PARTITION BY句のCOLUMN指定で列をグループ化することにより、列が属するパーティションを指定する際に柔軟性が得られます。
- COLUMN句に列のグループ化を指定する場合は、結合インデックスの選択リストで定義されている列の名前だけを指定できます。
列をその名前以外の名前で指定しようとすると、Teradata Databaseはリクエスト元にエラーを返します。
- Teradata Databaseは、結合インデックス定義の選択リストで指定された非グループ化列パーティションおよびグループ化列パーティションそれぞれに、列パーティションを定義します。
- 列パーティションにCOLUMNを指定した場合、Teradata Databaseは1つの物理コンテナに1つ以上の列パーティション値を格納します。
- 列パーティションにROWを指定した場合、Teradata Databaseは1つの物理的な副行に1つの列パーティション値だけを格納します。
副行はTeradataの行形式の標準ですが、副行という用語はそれが列パーティションの一部であることを強調するために使用します。
- 列パーティションに対してCOLUMN形式とROW形式のどちらも指定しない場合は、列パーティションに対してCOLUMN形式とROW形式のどちらを使用するかを、Teradata Databaseが列の特性に基づいて決定します。
列パーティション値は、特定の結合インデックスの行の列パーティションに含まれている各列の値で構成されます。
- 以下の表は、結合インデックス定義のPARTITION BY句でALL BUTオプションを使用する際のルールを示しています。
条件 Teradata Databaseの動作 ALL BUTを指定する 自動圧縮を適用する単一列パーティションを定義します。 選択リストで指定されていない列については、システム決定のCOLUMN形式またはROW形式を定義します。
ALL BUTを指定しない 選択リストで指定されていない列をグループ化して1つの列パーティションに入れ、自動圧縮を適用し、システム決定のCOLUMN形式またはROW形式を定義します。 - 以下の表は、結合インデックス定義のPARTITION BY句でNO AUTO COMPRESSオプションを使用する際のルールを示しています。
条件 Teradata Databaseの動作 列パーティションに対してNO AUTO COMPRESSを指定する 物理行に自動圧縮を適用しません。 列パーティションに対してNO AUTO COMPRESSを指定しない 物理行に自動圧縮を適用します。 - 列パーティションの形式は、COLUMNかROWのいずれかになります。両方の形式を組み合わせることはできません。
列パーティション結合インデックスの各列パーティションを別々の形式にすることは可能です。つまり、列パーティション結合インデックスの列パーティションは、すべてCOLUMN形式にすることも、すべてROW形式にすることも、あるいは一部をCOLUMN形式にしてその他をROW形式にすることもできます。
- パーティションに対して明示的にCOLUMN形式またはROW形式を指定しない場合は、Teradata Databaseが決定します。
COLUMN形式またはROW形式をシステムが設定する場合、Teradata Databaseは、列パーティションの列パーティション値のサイズや他の要素(列パーティションの列パーティション値が固定長か可変長か、列パーティションが単一列パーティションか複数列パーティションかなど)に基づいて形式を選択します。
一般に、Teradata Databaseは、幅の狭い列パーティションにはCOLUMN形式、幅の広い列パーティションにはROW形式を割り当てます。
列パーティションに対してどちらの形式をTeradata Databaseが選択したかを調べるには、HELP COLUMNリクエストを実行するか、DBC.ColumnsV(X )ビューからColumnPartitionFormat列を選択します。
なお、列パーティションに対して特定の形式を使用するために、明示的に形式を指定することもできます。
列パーティション テーブルでのArchive/Recoveryユーティリティ
- 列パーティションまたは行パーティション、あるいはその両方で、列パーティション結合インデックスをアーカイブ、復元、およびコピーできます。
また、列パーティション結合インデックスを含むデータベースまたはユーザーのアーカイブ、復元、またはコピーも可能です。
- 列パーティション結合インデックスから特定のパーティションを選択してアーカイブ、復元、またはコピーを行うことはできません。
- 列パーティション結合インデックスから特定のパーティションを選択してアーカイブ、復元、またはコピーを行うことはしないでください。
これは現在、2バイトPPI結合インデックスに対して有効ですが、廃止予定の機能です。
8バイトの列パーティション結合インデックスの特定のパーティションをアーカイブ、復元、またはコピーすることはできません。
列パーティション結合インデックスのオプション
- 列パーティション化
- フォールバック
テーブルが列パーティション化されている場合は、そのフォールバック行も基本データ行と同じパーティション化を使用して列パーティション化されます。
- セカンダリ インデックス
- BLOB、CLOB、ARRAY、VARRAY、およびGeospatialの各列。
インデックス要素としてのUDTの有効性には、1つ以上のLOB要素を含むUDTで定義されているNUSIは含まれてない。
LOB列には、行ハッシュ値あたり約64K行という制限があります。その理由は、列パーティション結合インデックスにはAMPあたりの行ハッシュ値が通常1つしかなく、型がBLOBまたはCLOBである列を含む列パーティション結合インデックスにはAMPあたり約64K行という制限もあるためです。