REVALIDATEオプションに関する一般的なルールと制約事項 - 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

REVALIDATEオプションを指定すると、パーティション テーブルまたは非圧縮結合インデックスのテーブル ヘッダーが再生成されます。さらに、nullパーティション処理オプションWITH DELETEまたはWITH INSERTも指定すると、テーブルの行パーティションが検証され、修正されます(結合インデックスの場合は、そのようになりません)。

非パーティションのテーブルと結合インデックスの場合は、PRIMARY INDEXを指定しないでREVALIDATEオプションを指定できます。そのようにすると、テーブルまたは結合インデックスにプライマリ インデックスがあるかどうかにかかわりなく、再検証が実行されます。

NoPIと基本AMPインデックス テーブルおよび結合インデックスの場合は、PRIMARY INDEXなしでREVALIDATEオプションを指定する必要があります。そうでない場合、データベースはリクエスト側にエラーを返します。

REVALIDATEオプションには、いくつかのデータ ディクショナリ列を再検証する機能も用意されています。

REVALIDATEリクエストでは、列パーティションのテーブルまたは結合インデックスの列パーティションは検証されません。

テーブル(結合インデックスを除く)でパーティション エラーが検出された場合は、WITH句を指定したALTER TABLE REVALIDATE文を使って修正できます。

REVALIDATEでは、以下のデータ ディクショナリ テーブルの列も再検証されます。

テーブル 列名 実行される検証処理
DBC.TVM PIColumnCount 現在の値が0であれば、プライマリ インデックス列の数に設定されます。
PartitioningLevels 現在の値が0であれば、パーティション レベルの数に設定されます。
DBC.TVFields PartitioningColumn 現在の値がNであれば、Yに設定されます。
DBC.TableConstraints
  • DefinedCombinedPartitions
  • MaxCombinedPartitions
  • PartitioningLevels
現在の値が0であれば、該当する値に設定されます。

このテーブルで取り上げたデータ ディクショナリ列がデータ ディクショナリに追加される前に既存のテーブルや結合インデックスが作成されていた場合は、アップグレード後に、それらの列が正しく設定されない可能性があります。テーブルまたは結合インデックスにプライマリ インデックスがあるかどうかに関係なく、REVALIDATEオプションを指定したALTER TABLE文を実行して、データ ディクショナリの列値を修正する必要があります。

パーティション テーブルまたはパーティション結合インデックスのテーブル ヘッダーを再検証しなければならない可能性があるのは、以下のような場合です。
  • パーティション テーブルまたは結合インデックスのテーブル ヘッダーに無効のマークが付いている場合。

    このような状態になることが多いのは、アップグレードの後、またはソースとは別のオペレーティング システムを実行するシステムや、別のハードウェアで稼働するシステムにテーブルの復元またはコピーを実行した後です。

  • DBS制御レコードのRoundHalfwayMagUpパラメータが変更されていて、パーティション式でDECIMAL演算が指定されている場合。

    DECIMALの丸めのルールに関する変更によって、パーティション式の評価が変わる場合があります。

    この状態がパーティション結合インデックスで発生した場合は、そのインデックスを削除してから再作成します。CREATE JOIN INDEXを参照してください。

  • DBS制御レコードに異なるRoundHalfwayMagUp設定されている別のシステムに、テーブルまたは結合インデックスが復元されるか、コピーされ、そのテーブルまたは非圧縮結合インデックスのパーティション式でDECIMAL演算が指定されている場合。

    DECIMALの丸めのルールに関する変更によって、パーティション式の評価が変わる場合があります。

  • テーブルまたは結合インデックスが別のシステムに復元されるか、コピーされ、パーティション式で浮動小数点演算が指定されている場合。

    浮動小数点の計算によって、パーティション式が別のシステムで異なる仕方で評価を行なう場合があります。

  • ハッシュ アルゴリズムの異なる別のシステムにテーブルまたは結合インデックスが復元されるか、コピーされ、パーティション式でHASHROW関数またはHASHBUCKET関数が指定されている場合。

    別のハッシュ関数によって、パーティション式の評価が変わる場合があります。

  • データベースのアップグレードで、テーブルと結合インデックスのパーティション式の計算が変わる場合。
  • CheckTableユーティリティまたは有効なSQLクエリーによって、テーブルまたは結合インデックスで、正しくない内部パーティション番号が付けられている行または間違ったパーティション内の行が検出される場合。

    これが予期せずに生じた場合、すぐにその問題をTeradataサポート センターに報告してください。

    この状態が結合インデックスで発生した場合は、そのインデックスを削除してから再作成します。CREATE JOIN INDEXを参照してください。

REVALIDATEオプションに関するルールを以下にまとめます。
  • プライマリ インデックスがないテーブルまたは結合インデックスでREVALIDATE PRIMARY INDEXを指定することはできません。

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

  • 1つのALTER TABLEリクエストで、インデックスまたはパーティションの定義の変更と、プライマリ インデックスまたはパーティションの再検証を両方実行することはできません。それらの操作は相互に排他的です。
  • 行パーティションが設定されていないテーブルでnullパーティション処理句WITH DELETEまたはWITH INSERTを指定することはできません。

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

  • 結合インデックスでnullパーティション処理句WITH DELETEまたはWITH INSERTを指定することはできません。それらのnullパーティション処理オプションは、テーブルの場合にのみ有効です。

    nullパーティション処理句を使用して結合インデックスを再検証しようとすると、データベースはリクエスト元にエラーを返します。

    非圧縮結合インデックスの行に問題があるのではないかと思える場合や、実際に問題が検出された場合は、その非圧縮結合インデックスを削除してから再作成する必要があります。

  • このオプションでnullパーティション処理句WITH DELETEもWITH INSERTも指定しない場合は、テーブル ヘッダーだけが再生成され、エラー検査や修復は実行されません。
  • Nullパーティション処理句WITH DELETEまたはWITH INSERTを指定する場合は、テーブルのテーブル ヘッダーが再生成されるだけでなく、パーティション番号と行のハッシュ値に関して、実テーブルの中のすべての行が検証されます。
  • WITH DELETE nullパーティション処理句を指定する場合は、パーティション式が(値がすでにINTEGER型またはCHARACTER型として定義されていなければINTEGERにキャストされた後で) 1から65,535までの値を生成しないすべての行がデータベースによって削除されます。
  • WITH INSERT [INTO] save_tablenullパーティション処理句を指定する場合は、パーティション式が(値がすでにINTEGER型またはCHARACTER型として定義されていなければINTEGERにキャストされた後で)1から65,535までの値を生成しないすべての行がデータベースによってテーブルから削除され、save_tableに挿入されます。

    Nullパーティション処理句と一緒にsave_tableを使用する操作に関するルールを以下にまとめます。

    • save_tabletable_nameと同じテーブルにすることはできません。そうしないと、システムはエラーを返します。
    • save_tabletable_nameは、互換データ型の列の数が同じでなければなりません。そうでない場合、システムはエラーを返します。
    • save_tableへの挿入でエラーが発生すると、有効なセッション モードに応じて、以下のロールバック動作が生じます。
      セッションのモード ロールバックされる作業のブロック
      ANSI リクエスト
      Teradata トランザクション
  • 行のパーティション式の評価によって評価エラーが発生すると、そのテーブルまたはsave_tableに対するすべての変更がデータベースによってロールバックされ、パーティション設定は変更されません。

    具体的なロールバック動作は、有効なセッション モードによって異なります。

    セッションのモード ロールバックされる作業のブロック
    ANSI リクエスト
    Teradata トランザクション
    これが生じた場合、以下の解決方法のいずれかを使用して、問題を訂正しなければなりません。
    • プライマリ インデックスのテーブルまたは非圧縮結合インデックスのプライマリ インデックスを非パーティション プライマリ インデックスにします。
    • パーティション式を、評価エラーを生成しないものに変更します。
    • 評価エラーの原因となる行を削除します。
    • テーブルを削除します。
  • テーブルの中に残っている行については、必要に応じて、内部パーティション番号と行のハッシュ値がデータベースによって更新され、行が正しいパーティションまたは行のハッシュに入っていなければ、正しい位置に移されます。

    割り当てられているROWIDごとに並んでいない行は修正されず、データベースによってリクエスト元にエラーが返されます。

  • 必要に応じて、テーブルで定義されているセカンダリ インデックス、結合インデックス、ハッシュ インデックスがデータベースによって更新されます。
  • テーブルの各行のシステム派生列PARTITIONまたはPARTITION#L[n]の値は変わることがあります。
  • テーブルのパーティション式が、タイムゾーン文字列(夏時間とタイムゾーン文字列として指定されたタイムゾーン文字列を参照)によって影響を受ける場合に、その文字列のタイムゾーンのルールが変更されていれば、nullパーティション処理オプションWITH INSERTまたはWITH DELETEを使用してテーブルを再検証する必要があります。
文字パーティションで使用するREVALIDATEオプションには、以下のルールが適用されます。
  • 以下のすべての条件に合致する場合は、文字ベースのパーティションを再検証しなければならない可能性があります。
    • テーブルまたは結合インデックスの作成時にセッションの照合がCHARSET_COLLだった場合。その場合、データベースは、テーブルまたは結合インデックスの照合として、テーブルの作成時に有効だったセッション文字セットのコード ポイントの順序を使用します。
    • 照合の文字セットが、以下の事前定義文字セットのいずれでもない場合。
      • ASCII
      • EBCDIC
      • UTF-8
      • UTF-16
    • テーブルが作成されてから、DBC.Translationテーブルの文字セットが変更されている場合。
  • 以下の2つの条件に合致する場合は、文字ベースのパーティションを再検証しなければならない可能性があります。
    • テーブルまたは非圧縮結合インデックスがMULTINATIONAL照合で作成された場合。
    • テーブルまたは非圧縮結合インデックスが作成された後で、別のMULTINATIONAL照合がDBC.Collationsにインストールされた場合。
  • 文字パーティション式にUnicode文字の式またはリテラルが1つ以上含まれており、データベースが、別のUnicode文字セットが定義されている以前のマイナー リリースに戻っている場合は、文字ベースのパーティションを再検証しなければならない可能性があります。

    以前のリリースの時点で定義されていないコード ポイントが後のリリースに含まれている場合は、テーブルまたは結合インデックスの再検証が必要になる可能性があります。

  • 再検証が必要な文字ベースのパーティションが結合インデックスで定義されている場合は、そのインデックスを削除してから再作成する必要があります。
  • システムは、文字ベースのパーティションを再構成し、正しいパーティションに行を移動するときに(nullパーティション ハンドラーが指定されていると仮定)、再生成後のパーティション式で、ALTER TABLE…REVALIDATEリクエストの実行時に有効だったセッションの照合ではなく、元のテーブルまたは結合インデックスの照合に関連付けられている照合を使用します。
  • データベースは、再生成後のパーティション式で、テーブルまたは結合インデックスが作成された時点、または最後にパーティションが変更された時点で有効だったセッションのモードの大文字小文字の区別に関するデフォルト設定を使用します。
  • テーブルまたは結合インデックスの作成時に有効だった照合文字セットは、DBC.CharTranslationsに存在してインストールされている必要があります。また、テーブルまたは結合オブジェクトの作成時と同じ数値コード(CharSetID列の値)、または以下の事前定義文字セットの任意のでなければなりません。
    • ASCII
    • EBCDIC
    • UTF-8
    • UTF-16

    文字セットがインストールされていない場合は、データベースはリクエスト元にエラーを返します。

    テーブルまたは結合インデックスの作成時に有効だった文字セットを再インストールできない場合は、そのテーブルまたは結合インデックスを再検証できません。その代わりに、適切なINSERT … SELECTリクエストを実行して、新しいテーブルに行を移動する必要があります。この新しいテーブルで、有効なパーティションを生成したり、必要に応じて現在のパーティションを削除したりできます。

  • 文字ベースのパーティションの新しい照合を処理する方法に関する相違点を以下の表にまとめます。
    パーティションの照合の種類 データベースが使用する照合
    MULTINATIONAL 現在インストールされているMULTINATIONAL照合が、テーブルまたは結合インデックスの作成時にインストールされていたMULTINATIONAL照合とは異なる場合でも、その現在のMULTINATIONAL照合を新しいパーティションの照合として使用します。
    CHARSET_COLL 元のパーティションの照合で使用されていた照合文字セットを新しいパーティションの照合として使用します。