17.00 - 17.05 - Nullパーティション処理句WITH INSERTとWITH DELETE - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Release Date
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-170K-JPN
Language
日本語 (日本)

テーブルまたは結合インデックスの行パーティションの変更または再検証を行なうときに使用するnullパーティション処理句WITH INSERT INTO save_tableとWITH DELETEに関するルールを以下にまとめます。

Nullパーティション処理句を指定しない場合

Nullパーティション処理句であるWITH INSERT INTO save_tableまたはWITH DELETEを指定しない場合、テーブルに現在含まれているすべての行の新しいパーティション式は、パーティション式の値がINTEGERまたはBIGINTにキャストされた後(INTEGER、BIGINT、またはCHARACTERにまだ型付けされていない場合)、1から、そのレベルで定義されているパーティション数までの範囲の値を生成する必要があります。

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

既存の行が新しいパーティション式に違反する場合

nullパーティション処理句WITH DELETEまたはWITH INSERT INTO save_tableを指定しなかった場合に、既存の行が新しいパーティション式に違反していると、その新しいパーティション式を適用することはできません。

暗黙のパーティションCHECK制約に違反する行(パーティション式の評価がnullになる行も含む)がテーブルに存在しないようにする必要があります。

Nullパーティション処理句WITH DELETE

Nullパーティション処理句WITH DELETEを指定すると、新しいパーティション式が、すでにINTEGER型、BIGINT型、CHARACTER型のいずれかとして定義されていなければINTEGERまたはBIGINTにキャストされた後で、1から、そのレベルで定義されているパーティション数までの範囲の値を生成しないすべての行が削除されます。

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

Nullパーティション処理句WITH INSERT INTO save_table

Nullパーティション処理句WITH INSERT INTO save_tableを指定すると、Teradata Databaseは、新しいパーティション式が、1からそのレベルで定義されているパーティション数までの範囲の値にならないすべての行を削除し、それらの行をsave_tableに挿入します。

この句に関するルールを以下にまとめます。

  • save_tabletable_nameと同じテーブルにすることはできません。同じテーブルにしようとすると、Teradata Databaseはリクエスト元にエラーを返します。
  • save_tabletable_nameは、互換データ型の列の数が同じでなければなりません。同じでないと、Teradata Databaseはリクエスト元にエラーを返します。

エラーが発生した場合のロールバック

テーブルの行の新しいパーティション式の評価がエラーになると、Teradata Databaseは、テーブルとsave_tableへの変更をロールバックし、パーティション設定を変更しません。

save_tableへの挿入でエラーが発生すると、セッション モードに応じて、以下のロールバック動作が生じます。

セッション モード ロールバックされた処理ブロック
ANSI リクエスト
Teradata トランザクション

新しいパーティション設定

あるレベルに対する新しいパーティション設定は、変更が成功するまで、そのレベルのパーティション設定になりません。

行パーティション テーブルの行の挿入または更新を後から行なう結果、その行のパーティション式が、1から、そのレベルで定義されているパーティション数までの範囲の値にならない場合、そのような操作を実行しようとすると、Teradata Databaseはリクエスト側にエラーを返します。

設定されたテーブルでの行パーティションの変更

テーブルまたは結合インデックスに列パーティションと行パーティションの両方がある場合に、データの入っているテーブルで行パーティションを変更すると、パフォーマンスに悪影響が出ます。テーブルの行を行パーティション間で移動する操作には、大きなコストがかかる場合が多いからです。

テーブルの変更または再検証の前にトリガーを無効にする

テーブルの変更や再検証を行なうALTER TABLEリクエストを実行するには、以下の表のとおり、まずそのトリガーを無効にしなければなりません。
行パーティションを変更または再検証するためのALTER TABLE句 無効にするトリガー
WITH DELETE table_nameのすべてのDELETEトリガー。

ALTER TABLEリクエストの完了後、無効にしたトリガーを再び有効にできます。

WITH INSERT INTO save_table
  • table_nameのすべてのDELETEトリガー。
  • save_tableのすべてのINSERTトリガー。

ALTER TABLEリクエストの完了後、無効にしたトリガーを再び有効にできます。