17.00 - 17.05 - 列の複数値圧縮の追加または変更に関するルール - 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です。
  • 複数値圧縮の場合、デフォルトの圧縮値はありません。

    複数値のすべての値を明示的に指定しなければなりません。

  • NULL受入可能列でのnullは、明示的に指定されていない場合でも、必ず自動的に圧縮されます。
  • 圧縮できるのは、最小で0個、最大ですべてですが、テーブルのプライマリ インデックス列セットは除きます。プライマリ インデックスまたはテーブルに行パーティションがある場合は、パーティション列の値を圧縮することはできません。
  • 列ごとの圧縮可能な個別の値の最大数は255です。
  • テーブル行ヘッダー内で、最大行数を超えて新しい列の結果の定義を変更または追加することはできません。
  • 既存の列を、複数値圧縮を含むように変更できます。
  • 複数値圧縮を使用するように既存の列を変更する直接的な方法に加えて、既存の列を変換して複数値圧縮をサポートする場合の次善策として、以下の2つがあります。
    • 1番目の次善策の手順を以下に示します。
      1. ALTER TABLEリクエストを使用して、任意の複数値圧縮をする新しい列を追加します。
      2. 置換用に設計した列からデータをコピーし、新しい列に入れます。
      3. ALTER TABLEを使用して、古い列を削除します。
      4. ALTER TABLEを使用し、削除した列の名前と一致するように新しい列の名前を変更します。
    • 2番目の次善策の手順を以下に示します。
      1. 必要に応じて、該当する複数値圧縮を定義してALTER TABLEリクエストを使用します。
      2. INSERT … SELECTリクエストを使用し、古いテーブルからデータをコピーして新しいテーブルに入れます。
      3. DROP TABLEリクエストを使用して、古いテーブルを削除します。
      4. ALTER TABLEリクエストを使用し、削除したテーブルの名前と一致するように新しいテーブルの名前を変更します。
  • NO COMPRESSオプションを指定することにより、既存の列から圧縮の指定を削除したり、新しい列値を圧縮不可として指定したりすることができます。
    指定する列 NO COMPRESSを使用すると可能になる動作
    すでに存在する場合 指定した列の圧縮を解除します。
    存在しない場合 指定した列の列値を圧縮不可にします。
  • 既存の列にCOMPRESS属性を追加した場合の効果は、以下で説明するように、COMPRESS句の特定の定義に応じて異なります。指定した列がNOT NULL属性で定義されている場合はnull圧縮を指定できないことに注意してください。
    • 指定の列に対してのみnullを圧縮する場合。
           ALTER TABLE table_name
             ADD column_name COMPRESS;

      これは、以下のリクエストと等価です。

           ALTER TABLE table_name
             ADD column_name COMPRESS NULL;
    • 指定の列に対して、nullと指定の定数値を圧縮する場合。
           ALTER TABLE table_name
             ADD column_name COMPRESS my_constant;

      column_nameがすでに存在する場合、およびcolumn_nameに対して圧縮複数値セットがすでに定義されている場合は、新しく指定された圧縮複数値セットが既存のセットに置き換わります。

    • 指定の列に対して、nullと指定の定数値のリストを圧縮する場合。
           ALTER TABLE table_name
             ADD column_name COMPRESS (constant_list);

      column_nameがすでに存在する場合、およびcolumn_nameに対して圧縮複数値セットがすでに定義されている場合は、新しく指定された圧縮複数値セットが既存のセットに置き換わります。

  • 新しい列を追加する際にNO COMPRESSを指定すると、その列にCOMPRESSを指定しなかった場合と同じ効果が得られます。この列は、新しい列を追加する同じリクエスト内の複数値圧縮で定義することはできません。
  • 既存の列を変更する際にNO COMPRESSを指定すると、その列からCOMPRESS属性は削除されます。
  • ALTER TABLE ADD COMPRESS構文は、以下のテーブルおよび列をサポートします。
    • あらゆるタイプのロードされたテーブル、および空のテーブル。
    • グローバル一時テーブル。
    • 参照制約で列以外のセカンダリ インデックス列がPRIMARY KEYまたはFOREIGN KEYの場合は、圧縮できません。
    • 結合インデックスが定義されている実テーブルの列。

      これを実行すると、圧縮による変更を反映するために結合インデックスの再作成が必要であることを通知する警告メッセージが、Teradata Databaseから返されます。

    • ハッシュ インデックスが定義されている実テーブルの列。
    • 単一のALTER TABLEリクエストにおける複数の列の変更。以下に、有効なALTER TABLEリクエストの例を示します。
           ALTER TABLE table_ex
             ADD column_1 COMPRESS (0,100, 200),
             ADD column_2 COMPRESS ('Female','Male'),
             ADD column_3 COMPRESS ('Teradata');
    • 同じALTER TABLEリクエストに含まれる、複数のオプションに対する変更の指定。以下に、有効なALTER TABLEリクエストの例を示します。
           ALTER TABLE table_ex
             ADD column_1 COMPRESS (0,100, 200),
             DROP column_2,
             ADD column_3 COMPRESS ('Teradata'),
            ADD column_4 INTEGER;
    • 非圧縮列を複数値圧縮へ変更。以下に例を示します。
           ALTER TABLE table_ex
             ADD column_4 COMPRESS (0, 1000, 10000);
    • 圧縮された列を圧縮しないための変更。以下に例を示します。
           ALTER TABLE table_ex
             ADD column_4 NO COMPRESS;
    • 既存の複数値圧縮に対する圧縮値の追加。これを実行できるのは、列に対する既存の圧縮複数値を置換場合のみです。例えば、table_excolumn_3で値セット(WalMart、JCPenney、Kmart)がすでに圧縮されているとします。

      以下のALTER TABLEリクエストにより、column_3の圧縮値リストにHarrahsが追加されます。

           ALTER TABLE table_ex
             ADD column_3
             COMPRESS ('WalMart','JCPenney','Kmart','Sears','Harrahs');
    • 既存の圧縮複数値リストからの圧縮値の削除。これを実行できるのは、列に対する既存の圧縮複数値のリストを置換場合のみです。例えば、table_excolumn_3で値セット(WalMart、JCPenney、Kmart、Harrahs)がすでに圧縮されているとします。

      以下のALTER TABLEリクエストにより、column_3の圧縮値リストからHarrahsが削除されます。

           ALTER TABLE table_ex
             ADD column_3
             COMPRESS ('WalMart','JCPenney','Kmart','Sears');
  • ALTER TABLE MODIFY COMPRESS構文は、以下の機能をサポートしません。
    • DBC.TVField.CompressValueList列によって定義された、最大サイズの8,192文字を超える圧縮複数値リスト。
    • テーブル ヘッダーが最大サイズの128キロバイトを超える圧縮複数値リスト。
    • 一時ジャーナルが最大サイズの65,535バイトを超える圧縮複数値リスト。
    • 列に対して指定されているデータ型との互換性がない値を含む圧縮複数値リスト。たとえば、INTEGER型の列の複数値圧縮に対して文字列追加を試みる場合。
    • 列に対する固有値が最大数の255を超える圧縮複数値。
    • 列にNOT NULL属性が含まれる場合のNULL圧縮。
    • 現在のセッションの文字セットにはない文字を含む圧縮値または圧縮複数値。
    • 圧縮複数値にすでに含まれている値と重複する圧縮値。例えば、CHARACTER列の圧縮の複数値に文字列'WalMart'を2回追加しようとする場合。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

    • 同一のALTER TABLEリクエストにおける、同じ列の圧縮複数値特性の2回以上の変更。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

    • 同一のALTER TABLEリクエストにおける、複数値圧縮特性および制約特性の両方の変更。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

    • 複数値圧縮を追加するための、非パーティション テーブルまたはパーティション テーブルのプライマリ インデックス列の変更(プライマリ インデックスの列は、圧縮された値を使用できないため)。

      変更しようとすると、システムはリクエスト元にエラーを返します。

    • 行パーティション テープルのパーティション列セットのメンバーである列に対する複数値圧縮の追加。

      変更しようとすると、システムはリクエスト元にエラーを返します。

    • 複数値圧縮を追加するための、参照整合性制約を構成する列の変更。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

    • 複数値圧縮を追加するための識別列の変更(識別列の値を圧縮できないため)。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

    • 複数値圧縮を追加するための、以下のデータ型の任意のである列の変更。
      • LONG VARCHAR
      • BLOB
      • CLOB
      • UDTの場合、基礎になるデータ型(STRUCTURED型UDTの場合はデータ型セット)の内容には関係ありません。

      これが発生した場合、リクエストはアボートされ、システムはリクエスト側にエラーを返します。

  • 列の拡張圧縮値はデータ ディクショナリに保管されます。

    テキストが、DBC.TVFields.CompressValueListの最大サイズである8,192文字を超えると、ALTER TABLEリクエストが失敗します。

  • NULL受入可能列での圧縮される値のリストは、nullまたは1つ以上の個別の定数値です。
  • NULL受入不可能の列で圧縮される値のリストには、nullを含めることはできません。
  • 圧縮される複数値には、同一の固有値を複数回指定することはできません。