CREATE TABLE

CREATE TABLE文は、表を定義します。

CREATE TABLE文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。

必要な権限セクションを確認してから、次を確認してください。

必要な権限

CREATE TABLE(所有者の場合)またはCREATE ANY TABLE(非所有者の場合)。

作成された表の所有者には、REFERENCE句によって参照される表に対するREFERENCES権限が必要です。

TimesTen Classicの場合:

  • DDL_REPLICATION_LEVEL=2以上およびDDL_REPLICATION_ACTION=INCLUDEのときに、アクティブ・スタンバイ・ペア間で新しい表をレプリケートする場合は、ADMIN権限が必要です。

  • これらの属性によって、CREATE TABLEでは暗黙的にALTER ACTIVE STANDBY PAIR... INCLUDE TABLE文が実行されます。詳細は、「ALTER SESSION」を参照してください。

この項を確認した後、次を参照してください。

CREATE TABLE: TimesTen Scaleoutでの使用方法

この文は、TimesTen Scaleoutでサポートされています。列ベースの圧縮およびエージングはサポートされていません。グローバル一時表では、索引使用句と分散句はサポートされていません。

次を参照してください。

CREATE TABLEのSQL構文: TimesTen Scaleout

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName
(
    ColumnDefinition [,...]
     [PRIMARY KEY (ColumnName [,...]) [UsingIndexClause1]]|
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
            [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
    
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[DistributionClause]
[AS SelectQuery]

次に、UsingIndexClause1の構文を示します。ノート: CreateIndexStmtは、TimesTenのCREATE INDEX文です。詳細は、「CREATE INDEX」を参照してください。一意索引は主キーの要件であるため、その索引を作成する必要があります。

UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)
DistributionClauseの構文は、次のとおりです。
DistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | 
DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE

ノート:

PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。UsingIndexClause1句を指定する場合は、PRIMARY KEYを指定する必要があり、PRIMARY KEYColumnDefinition句の後に指定する必要があります。UsingIndexClause1句は、ColumnDefinition句の一部としては指定できません。

グローバル一時表の構文:

UsingIndexClause1DistributionClauseは、グローバル一時表ではサポートされていません。構文は次のとおりです:

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...])] |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
      }
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[ON COMMIT { DELETE | PRESERVE } ROWS ]

CREATE TABLEのパラメータ: TimesTen Scaleout

パラメータ 説明

CREATE TABLE [Owner.]TableName

CREATE TABLEは、表の作成を指示します。表の名前を指定する必要があります。表の所有者の指定はオプションです。

(ColumnDefinition)

ColumnDefinitionは、列名やデータ型などを指示します。ColumnDefinitionの説明は、「列定義: TimesTen Scaleout」を参照してください。

AS SelectQuery句を指定する場合、ColumnDefinitionはオプションです。

PRIMARY KEY (ColumnName [,...])

ColumnDefinitionの後にPRIMARY KEYキーワードを配置することで、列の定義後にPRIMARY KEYを指定するように指示します。これにより、主キーには複数の列を指定できます。

[UsingIndexClause1] UsingIndexClause1はオプションです。説明は、この表の次の2行に示します。CREATE TABLEの定義には、2つのUSING INDEX句を指定できません。この句を使用すると、PRIMARY KEYに対するグローバル索引またはローカル索引を定義できます。
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause1]の一部。指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
USING INDEX (CreateIndexStmt) [UsingIndexClause1]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キーの要件に応じて、一意索引を作成する必要があります。

CONSTRAINT ForeignKeyName

オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。

FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 "NO ACTION"の更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

AS SelectQuery句を指定する場合は、作成する表に対して外部キーを定義できません。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

UNIQUE HASH ON

表のハッシュ索引。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

AS SelectQuery句を指定する場合は、作成する表にHashColumnNameを定義する必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

[ON COMMIT {DELETE|PRESERVE} ROWS]

グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。

AS SelectQuery

指定すると、SelectQueryの結果セットの内容から新しい表が作成されます。SelectQueryで返される行が表に挿入されます。

データ型およびデータ型の長さは、SelectQueryから導出されます。

SelectQueryは、副問合せを含めることも含めないこともできる有効なSELECT文です。

SELECT動詞の後に文レベルのオプティマイザ・ヒントを指定できます。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

DistributionClause

TimesTen Scaleoutのみでサポートされています。3つのオプションがあります。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DUPLICATE

  • DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)]

DISTRIBUTE BY HASH句は、主キーのハッシュまたはユーザー定義分散列のハッシュに基づいてデータを分散するハッシュ分散スキームを指定します。行はレプリカ・セット間で分散され、各行は1つのレプリカ・セットに存在します。分散キーはオプションです。指定する場合は、1つ以上の列で構成され、それらの列はデータを分散するために使用されます。

DUPLICATE句は、表のデータの同一コピーをデータベースのすべての要素に分散する複製分散スキームを指定します。表のすべての行が各要素に存在します。

DISTRIBUTE BY REFERENCE句は、外部キー制約によって定義された親行の位置に基づいて子表のデータを分散する参照分散スキームを指定します。子表の行は、親表と同じレプリカ・セットに存在します。DISTRIBUTE BY REFERENCE句では外部キー制約はオプションです。ただし、複数の外部キー制約を定義した場合、DISTRIBUTE BY REFERENCE句でいずれかの外部キー制約を指定する必要があります。

句を指定しない場合、デフォルトはDISTRIBUTE BY HASHです。

AS SelectQuery句の前にDistributionClauseを指定する必要があります。

分散キー列は更新できません。

GLOBAL TEMPORARY

作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。

DistributionClauseはサポートされていません。

TRUNCATE TABLEは、グローバル一時表でサポートされていません。

ローカルの一時表は、サポートされていません。

グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。

グローバル一時表にはAS SelectQuery句を指定しないでください。

ColumnName

表の列の名前。

主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、ColumnNameはオプションです。外部キーに対して指定しない場合、参照されるのは親表の主キーです。

AS SelectQuery句を指定する場合、ColumnNameを指定する必要はありません。AS SelectQuery句にデータ型を指定しないでください。

列定義: TimesTen Scaleout

SQL構文

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal]
 [[NOT] INLINE]
 [PRIMARY KEY | UNIQUE | 
 NULL [UNIQUE] | 
 NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] 
]

列定義のパラメータ

列定義には、次のパラメータがあります。

パラメータ 説明

ColumnName

新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。

AS SelectQuery句を指定する場合、ColumnNameはオプションです。列名の数は、SelectQueryの列の数と一致している必要があります。

ColumnDataType

列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

AS SelectQuery句を指定する場合、ColumnDataTypeは指定しないでください。

DEFAULT DefaultVal

INSERT文で列の値が指定されていない場合は、列にデフォルト値DefaultValを挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。ROWIDデータ型について、または読取り専用キャッシュ・グループの列についてデフォルト値を割り当てることはできません。また、DEFAULT句でファンクションを使用することはできません。

DefaultValでは、次のデータ型がサポートされます。

デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHAR2のいずれかであり、列の幅は30文字以上である必要があります。

AS SelectQuery句を指定する場合は、オプションで、作成する表にDEFAULT句を指定することもできます。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にINLINE | NOT INLINE句を指定することもできます。

NULL

列にNULL値を含めることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNULLを指定することもできます。

NULLを指定した場合は、ENABLEを指定できません。

NOT NULL [ENABLE]

列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNOT NULL[ENABLE]を指定することもできます。

NOT NULLを指定する場合は、オプションでENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

UNIQUE

列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。PRIMARY KEYとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にUNIQUEを指定することもできます。

PRIMARY KEY

列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。UNIQUEとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にPRIMARY KEYを指定することもできます。

CREATE TABLEのUSING INDEX句の説明: TimesTen Scaleout

CREATE TABLEの定義には、PRIMARY KEY句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING INDEX {GLOBAL | LOCAL}句の後にオプションでUSE HASH INDEX句を指定できます。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文を使用してハッシュ索引を作成する場合は、CREATE INDEX文の詳細について、「CREATE INDEX」を参照してください。

ノート:

CREATE TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
ハッシュ索引の作成時には、ハッシュ索引のサイズを設定する必要があります。TimesTenには、この目的のためのPAGES=句があります。次のオプションを検討してください:
  • USING INDEX...CreateIndexStmt句を指定してHASH索引を作成する場合は、PAGES=句を指定するオプションがあります。PAGES=句を指定しない場合、TimesTenは、デフォルトとしてPAGES=CURRENTを使用してハッシュ索引のサイズを設定します。(CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください)。

  • UNIQUE HASH ON句(CREATE TABLE定義の一部)を指定する場合は、ハッシュ索引のサイズを設定するためのPAGES=句を指定する必要があります。

  • USING INDEX...CreateIndexStmtUNIQUE HASH ON句の両方(CREATE TABLE定義の一部)を指定すると、TimesTenは、UNIQUE HASH ON...PAGES=句で指定された値を使用してハッシュ索引のサイズを設定します。また、TimesTenは警告も発行します。この警告では、ハッシュ索引に対して異なるページ数の指定があることと、UNIQUE HASH ON...PAGES=句で指定された値を使用していることが示されます。

この例では、PAGES=句はCreateIndexStmt句(PAGES=200)とUNIQUE HASH ON句(PAGES=400)の両方で指定されています。TimesTenは警告を発行して、ハッシュ索引のサイズ設定にPAGES=400を使用します。
Command> CREATE TABLE mytab (col1 TT_INTEGER, col2 TT_INTEGER, PRIMARY KEY (col1, col2)
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myindex on mytab (col1,col2) PAGES=200)) 
           UNIQUE HASH ON (col1,col2) PAGES=400 DISTRIBUTE BY HASH (col1);
Warning  2252: Different number of pages specified for hash index MYINDEX in table and index definition. 
Index created with pages = 400
制限:
  • USING INDEX句は、表に対する外部キー制約には使用できません。

  • USING INDEX句は、ビューには使用できません。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

CREATE TABLEの追加情報: TimesTen Scaleout

  • TimesTen Scaleoutは、3つの分散スキームのいずれかによってデータを分散します。

    • ハッシュ: TimesTen Scaleoutは、主キー列またはDISTRIBUTED BY HASH句で指定された1つ以上の列のハッシュに基づいてデータを分散します。指定した行がレプリカ・セットに格納されます。行はレプリカ・セット間で均一に分散されます。大部分の表に適しているため、ハッシュはデフォルトの分散スキームです。

    • 参照: TimesTen Scaleoutは外部キーで識別される親表の場所に基づいて子表のデータを分散します。子表の指定した行が親表と同じレプリカ・セットに存在します。この分散スキームは、1つのレプリカ・セット内の関連データを分散することで、結合を最適化します。ハッシュまたは参照によって親表を分散できます。ハッシュによって分散された場合、親はルート表と呼ばれます。子(外部)キー列をNOT NULLとして定義する必要があります。

    • 複製: TimesTen Scaleoutは、データの同一のコピーをデータベースのすべての要素に分散します。すべての行がすべての要素に存在します。この分散スキームは、各データ・インスタンスに同一のデータを格納することで、読取りのパフォーマンスを最適化します。この分散スキームは、比較的小さい、頻繁に読み取られる、変更頻度の低い表に適しています。

    詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』「表の分散スキームの定義」および「表の分散スキームの定義」を参照してください。

  • ハッシュ分散スキームを使用する表の場合:

    • 指定された場合、分散キーが使用されます。

    • 分散キーが指定されない場合は、主キーが使用されます。

    • 主キーまたは分散キーがない場合は、非表示列が使用されます。データはランダムかつ均等に分散されます。

    表に主キーが定義されている場合は、分散キーを指定する必要がありますが、主キーはデータを分散する最適な方法ではありません。主キーがなく、一意の列がある場合、この一意の列にデータを分散できます。主キーがなく、一意の列がない場合は、分散キーを指定しないでください。TimesTen Scaleoutは、非表示列にデータを分散します。

  • 参照による分散スキームの場合:

    • DISTRIBUTE BY REFERENCE句では、1つの外部キー制約のみを参照できます。子表に複数の外部キー制約がある場合がありますが、参照分散を決定するために1つのみを使用できます。

    • 参照先外部キー制約が複数ある場合は、制約句で指定する必要があります。

    • 参照分散句内の外部キー制約は、主キーまたは親表の一意キーを参照する必要があります。親表がルートである場合、参照先キーは分散キーである必要があります。

    • 親表の非分散キー列への外部キー関係を作成できますが、この外部キー関係に基づいて参照によって分散することはできません。

    • DISTRIBUTE BY REFERENCE句で使用されている外部キー列は更新できません。

  • 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。例外は、外部キーと参照表を使用している場合です。
  • CREATE TABLE...AS SELECT文を使用して、元表の定義に基づいて新しい表を作成できます。主キー制約は新しい表に引き継がれないため、新しい表に主キー制約を定義しない場合、データの分散方法が変更されることに注意してください。

    詳細は、「CREATE TABLE...AS SELECTの使用」を参照してください。

  • 列を同じ値に更新しないかぎり、分散キー列を更新できません。

  • 主キーに保存されるすべての列は、NOT NULLである必要があります。

  • ColumnDefinitionで指定されたPRIMARY KEYは、1つの列に対してのみ指定できます。

  • PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

  • 主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。

  • 主キー列は、列を同じ値に更新する以外の更新はできません。

  • インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。

    • TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。

    • TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。

    • TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。

    • 列を保存するとオーバーヘッドが少なくなります。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • キャッシュ表を参照する外部キーを持つ表は作成できません。

  • UNIQUE列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。

  • 表の主キーで使用する索引を変更するには、ALTER TABLE文を使用します。

  • AS SelectQuery句を指定する場合:

    • データ型およびデータ型の長さは、SelectQueryから導出されます。作成する表の列にデータ型を指定しないでください。

    • SelectQueryで列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL制約を定義します。

    • 選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていたNOT NULL制約は、新しい表に引き継がれます。選択した表のNOT NULL制約を無効にするには、新しい列をNULLとして定義します。次に例を示します:

      CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
      
    • NOT INLINE/INLINE属性は新しい表に引き継がれます。

    • 一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。

    • SelectQueryのすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQueryの列と同じです。SelectQueryに単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE文で列に名前を付けます。

    • 作成する表に対して外部キーを指定しないでください。

    • SelectQuerySELECT FOR UPDATEを指定しないでください。

    • AS SelectQuery句を使用する場合、ORDER BY句はサポートされません。

    • SelectQueryに集合演算子UNIONMINUSおよびINTERSECTを含めることはできません。

  • デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、UNIQUE HASH句を使用してください。

    • アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、その表に対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。

  • ハッシュ索引は、表が存在している間、ALTER TABLE文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。

    ハッシュ索引のサイズが適性に設定されていることを確認するには、SET PAGES句のRowPagesパラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

  • ハッシュ・キーには、最大16列を指定できます。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

    • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADEには、次の規則も適用されます。

    • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。

例: TimesTen Scaleoutのグローバル索引とローカル索引

次に示す例は、CREATE TABLE...PRIMARY KEYでグローバル索引を使用するための様々な構文の使用を示しています。

主キーを指定する表を作成します。USING INDEX GLOBAL句を使用して、グローバル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX GLOBAL) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  MYTAB: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX LOCAL句を使用して、ローカル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
  PRIMARY KEY (c,b) USING INDEX LOCAL DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  MYTAB: unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx ON mytab (c,b))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。CREATE INDEX定義では、索引定義に追加の列を含めるためのINCLUDE句を指定します。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx 
           ON mytab (c,b) INCLUDE (a))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique range index on columns:
    C
    B
    Included columns:
      A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル一意ハッシュ索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX GlobalUniqueIdx 
           ON mytab (c,b))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

その他の例: TimesTen Scaleout

これらの例では、重複、ハッシュおよび参照分散スキームを使用して表を作成する方法を示します。

これらの例では、DISTRIBUTE BY REFERENCE分散スキームを使用して表を作成する方法を示します。

「CREATE TABLE...AS SELECTの使用」には、TimesTen ScaleoutでのCREATE TABLE...AS SELECTの使用方法が示されています。

account_type表の作成

この例では、ttIsqlを実行してaccount_type表を作成し、複製分散スキームを使用してデータを分散します。この表には少数の行が含まれ、複製分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。

Command> CREATE TABLE account_type ( type CHAR(1) NOT NULL PRIMARY KEY,
           description VARCHAR2(100) NOT NULL) DUPLICATE;

account_status表の作成

この例では、ttIsqlを実行してaccount_status表を作成し、複製分散スキームを使用します。表のサイズは小さく、分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。

Command> CREATE TABLE account_status(status NUMBER(2) NOT NULL PRIMARY KEY,
           description VARCHAR2(100) NOT NULL) DUPLICATE;

顧客表の作成

この例では、ttIsqlを実行してcustomers表を作成し、ハッシュによって表を分散します。表内のデータは、cust_id列(主キー)のハッシュに基づいて各要素に分散されます。

Command> CREATE TABLE customers(cust_id NUMBER(10,0) NOT NULL PRIMARY KEY,
           first_name VARCHAR2(30) NOT NULL,last_name VARCHAR2(30) NOT NULL,
           addr1 VARCHAR2(64),addr2 VARCHAR2(64), zipcode VARCHAR2(5),
           member_since DATE NOT NULL)
         DISTRIBUTE BY HASH;

アカウント表の作成

この例では、ttIsqlを実行してaccounts表を作成し、3つの主キー/外部キー関係を定義します。accounts表は参照によって分散され、データはfk_customer外部キー制約に基づいて分散されます。このスキームは、(fk_customer外部キー制約の) customers.cust_id親列の対応する値の場所に基づいてaccounts表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。

Command> CREATE TABLE accounts(account_id NUMBER(10,0) NOT NULL PRIMARY KEY,
           phone VARCHAR2(15) NOT NULL,account_type CHAR(1) NOT NULL,
           status NUMBER(2) NOT NULL,current_balance NUMBER(10,2) NOT NULL,
           prev_balance NUMBER(10,2) NOT NULL,date_created DATE NOT NULL,
           cust_id NUMBER(10,0) NOT NULL,
         CONSTRAINT fk_customer FOREIGN KEY (cust_id)
         REFERENCES customers(cust_id),CONSTRAINT fk_acct_type
         FOREIGN KEY (account_type)
         REFERENCES account_type(type),
         CONSTRAINT fk_acct_status
         FOREIGN KEY (status)
         REFERENCES account_status(status)
         )
         DISTRIBUTE BY REFERENCE (fk_customer);

トランザクション表の作成

この例では、ttIsqlを実行してtransactions表を作成します。transactions表は参照によって分散され、データはfk_accounts外部キー制約に基づいて分散されます。このスキームは、(fk_accounts外部キー制約の) accounts.account_id親列の対応する値の場所に基づいてtransaction表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。

accounts親表も参照によって分散されます。これは、参照分散階層による2レベルの分散を定義します。

Command> CREATE TABLE transactions(transaction_id NUMBER(10,0) NOT NULL,
           account_id NUMBER(10,0) NOT NULL ,
           transaction_ts TIMESTAMP NOT NULL,
           description VARCHAR2(60),
           optype CHAR(1) NOT NULL,
           amount NUMBER(6,2) NOT NULL,
         PRIMARY KEY (account_id, transaction_id, transaction_ts),
         CONSTRAINT fk_accounts FOREIGN KEY (account_id)
         REFERENCES accounts(account_id)
         )
         DISTRIBUTE BY REFERENCE (fk_accounts);

表の表示

この例では、ttIsql tablesコマンドを実行して、データベースの表を表示します。

Command> tables;
  SAMPLEUSER.ACCOUNTS
  SAMPLEUSER.ACCOUNT_STATUS
  SAMPLEUSER.ACCOUNT_TYPE
  SAMPLEUSER.CUSTOMERS
  SAMPLEUSER.TRANSACTIONS
5 tables found.

accounts表の定義の表示

この例では、ttIsql describeコマンドを実行して、accounts表の定義を表示します。

Command> describe accounts;
 
Table SAMPLEUSER.ACCOUNTS:
  Columns:
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
    PHONE                           VARCHAR2 (15) INLINE NOT NULL
    ACCOUNT_TYPE                    CHAR (1) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
    CURRENT_BALANCE                 NUMBER (10,2) NOT NULL
    PREV_BALANCE                    NUMBER (10,2) NOT NULL
    DATE_CREATED                    DATE NOT NULL
    CUST_ID                         NUMBER (10) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_CUSTOMER)
 
1 table found.
(primary key columns are indicated with *)

1つの外部キーを含むDISTRIBUTE BY REFERENCE

この例は、DISTRIBUTE BY REFERENCE句で外部キー制約を指定する必要がないことを示しています。1つの外部キーのみがあります。

最初にOrders表を作成し、ハッシュによって分散します。

Command> CREATE TABLE Orders
           (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
            OrderDate DATE NOT NULL,
            discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

1つの外部キー制約を含むOrderDetails表を作成します。分散句で制約を指定する必要はありません。

Command> CREATE TABLE OrderDetails
           (OrderId TT_INTEGER NOT NULL,
            PartId TT_INTEGER NOT NULL,
            Quantity TT_INTEGER NOT NULL,
         FOREIGN KEY (OrderId)
         REFERENCES Orders (OrderId))
         DISTRIBUTE BY REFERENCE;

ttIsql describeコマンドを実行して、表を表示します。

Command> describe Orders;
 
Table SAMPLEUSER.ORDERS:
  Columns:
   *ORDERID                         TT_INTEGER NOT NULL
    ORDERDATE                       DATE NOT NULL
    DISCOUNT                        BINARY_FLOAT
  DISTRIBUTE BY HASH (ORDERID)
 
1 table found.
(primary key columns are indicated with *)

Command> describe OrderDetails;
 
Table SAMPLEUSER.ORDERDETAILS:
  Columns:
    ORDERID                         TT_INTEGER NOT NULL
    PARTID                          TT_INTEGER NOT NULL
    QUANTITY                        TT_INTEGER NOT NULL
  DISTRIBUTE BY REFERENCE
 
1 table found.
(primary key columns are indicated with *)

複数の外部キーを含む表

この例は、表に複数の外部キー制約が含まれている場合、参照として使用される外部キー制約をDISTRIBUTE BY REFERENCE句で指定する必要があることを示しています。customers2表は親となり、ハッシュによって分散されます。OrderDetails2表には2つの外部キー制約が含まれており、この表は参照によってc1_1制約で分散されます。この制約をDISTRIBUTED BY REFERENCE句に含める必要があります。

Command> CREATE TABLE customers2 (CustomerId TT_INTEGER NOT NULL PRIMARY KEY,
           LastOrderDate DATE NOT NULL,PromotionDiscount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE OrderDetails2 (OrderId TT_INTEGER NOT NULL,
           CustomerId TT_INTEGER NOT NULL, Quantity TT_INTEGER NOT NULL,
         CONSTRAINT c1_1 FOREIGN KEY (OrderId) 
         REFERENCES Orders (OrderId),
         CONSTRAINT c2_2 FOREIGN KEY (CustomerId) 
         REFERENCES Customers2 (CustomerId))
         DISTRIBUTE BY REFERENCE (c1_1);

親表の分散キーに基づかない外部キー関係

この例は、OrderId主キーおよびCouponId一意キーを持つorders2親表を作成します。この表は、ハッシュによって分散されます。分散キーが指定されていないため、データはハッシュによってOrderId主キーで分散されます。coupons子表はCouponId一意キーに外部キー関係を確立します。このキーはorders2親表の分散キーではないため、TimesTen Scaleoutはエラーをスローします。

Command> CREATE TABLE Orders2 (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
           CouponId TT_INTEGER NOT NULL UNIQUE, OrderDate DATE NOT NULL,
           discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE Coupons (CouponId TT_INTEGER NOT NULL, 
           discount BINARY_FLOAT,
         CONSTRAINT CouponC1 FOREIGN KEY (CouponId) 
         REFERENCES Orders2 (CouponId) )
         DISTRIBUTE BY REFERENCE (CouponC1);
 1067: The Parent keys for a distribute by reference table with hash distributed
parent must include the distribution keys of the parent.
The command failed.

第1レベルおよび第2レベルの子外部キー関係の使用

この例では、Coupons2親表を作成し、ハッシュによってデータを分散します。Orders3子表は第1レベルの外部キー関係として作成され、親表(Coupons2)はルート表です。OrderDetails3子表は第2レベルの外部キー関係として作成され、親表(Orders3)は参照表です。

Command> CREATE TABLE Coupons2 (CouponId TT_INTEGER NOT NULL PRIMARY KEY, 
           discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE Orders3 (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
           CouponId TT_INTEGER NOT NULL, OrderDate DATE NOT NULL,
           discount BINARY_FLOAT, CONSTRAINT c1_coupons FOREIGN KEY (CouponId)
         REFERENCES Coupons2 (CouponId))
         DISTRIBUTE BY REFERENCE (c1_coupons);

Command> CREATE TABLE OrderDetails3 (OrderId TT_INTEGER NOT NULL,
           PartId TT_INTEGER NOT NULL, quantity TT_INTEGER NOT NULL,
         CONSTRAINT c1_orders FOREIGN KEY (OrderId)
         REFERENCES Orders3 (OrderId))
         DISTRIBUTE BY REFERENCE (C1_orders);

CREATE TABLE...AS SELECTの使用

この例では、customers表に基づいてNewCustomers表を作成します。主キー制約を定義することで、同じ分散スキームを保持し、データが主キーに基づいて分散されるようにします。

Command> CREATE TABLE NewCustomers(cust_id PRIMARY KEY, first_name, last_name, 
           addr1, addr2, zipcode, member_since) AS SELECT * FROM customers;
0 rows inserted.
Command> describe NewCustomers;
 
Table SAMPLEUSER.NEWCUSTOMERS:
  Columns:
   *CUST_ID                         NUMBER (10) NOT NULL
    FIRST_NAME                      VARCHAR2 (30) INLINE NOT NULL
    LAST_NAME                       VARCHAR2 (30) INLINE NOT NULL
    ADDR1                           VARCHAR2 (64) INLINE
    ADDR2                           VARCHAR2 (64) INLINE
    ZIPCODE                         VARCHAR2 (5) INLINE
    MEMBER_SINCE                    DATE NOT NULL
  DISTRIBUTE BY HASH (CUST_ID)
 
1 table found.
(primary key columns are indicated with *)

ttIsql describeを実行して、元のcustomers表を表示します。

Command> describe Customers;

Table SAMPLEUSER.CUSTOMERS:
  Columns:
   *CUST_ID                         NUMBER (10) NOT NULL
    FIRST_NAME                      VARCHAR2 (30) INLINE NOT NULL
    LAST_NAME                       VARCHAR2 (30) INLINE NOT NULL
    ADDR1                           VARCHAR2 (64) INLINE
    ADDR2                           VARCHAR2 (64) INLINE
    ZIPCODE                         VARCHAR2 (5) INLINE
    MEMBER_SINCE                    DATE NOT NULL
  DISTRIBUTE BY HASH (CUST_ID)
 
1 table found.
(primary key columns are indicated with *)

CREATE TABLEのSQL構文: TimesTen Classic

PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...]) |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
            [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
    }
)
[ColumnBasedCompression]
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[AGING {LRU|
         USE ColumnName
             LIFETIME Num1 {SECOND[S] | MINUTE[S] | HOUR[S] |DAY[S]}
               [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
       }[ON|OFF]
] 
[AS SelectQuery]

グローバル一時表の構文は、次のとおりです。

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...]) |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
      }
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[ON COMMIT { DELETE | PRESERVE } ROWS]

CREATE TABLEのパラメータ: TimesTen Classic

パラメータ 説明

[Owner.]TableName

新しい表に割り当てる名前です。2つの表に同じ所有者名と表名を指定することはできません。

所有者名を指定していない場合は、ログイン名が新しい表の所有者名になります。TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。Oracle Database表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。

名前を定義するためのルールについては、「基本名」を参照してください。

GLOBAL TEMPORARY

作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

DDL_REPLICATION_LEVELが2以上の場合、グローバル一時表の作成はアクティブ・スタンバイ・ペア内でレプリケートされますが、グローバル一時表はレプリケーション・スキームに含まれません。

DATASTORE要素が指定されている場合、一時表はアクティブ・スタンバイ・ペアから自動的に除外されます。

キャッシュ・グループ表は、一時表として定義できません。

一時表の変更は、XLAで追跡できません。

一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。

TRUNCATE TABLEは、グローバル一時表でサポートされていません。

ローカルの一時表は、サポートされていません。

グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。

グローバル一時表にはAS SelectQuery句を指定しないでください。

ColumnDefinition

表の個々の列です。各表には、列が少なくとも1つ必要です。

AS SelectQuery句を指定する場合、ColumnDefinitionはオプションです。

ColumnName

表の列の名前。CREATE TABLE文の様々な句で使用されます。

主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、ColumnNameはオプションです。外部キーに対して指定しない場合、参照されるのは親表の主キーです。

AS SelectQuery句を指定する場合、ColumnNameを指定する必要はありません。AS SelectQuery句にデータ型を指定しないでください。

PRIMARY KEY

PRIMARY KEYは、表定義で一度だけ指定できます。これによって、1つ以上の列が表の主キーを構成していることを示します。主キーの内容は一意かつNOT NULLである必要があります。列には、UNIQUEと単一列PRIMARY KEYの両方を指定することはできません。

CONSTRAINT ForeignKeyName

オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。

FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 "NO ACTION"の更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

AS SelectQuery句を指定する場合は、作成する表に対して外部キーを定義できません。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

ColumnBasedCompression

データをより効率的に格納する、列レベルでの圧縮を定義します。列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

UNIQUE

UNIQUE列の各行の値が一意である必要があることを示します。

UNIQUE HASH ON

表のハッシュ索引。このパラメータは、等価条件に使用します。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

AS SelectQuery句を指定する場合は、作成する表にHashColumnNameを定義する必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

[ON COMMIT {DELETE|PRESERVE} ROWS]

グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。

[AGING LRU [ON|OFF]]

指定する場合、表のLRUエージング・ポリシーを定義します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』「ttAgingLRUConfig」および「ttAgingTableLRUConfig」と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「表へのエージング・ポリシーの実装」を参照してください。

[AGING USE ColumnName...[ON|OFF]]

指定する場合、表の時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(秒、分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

TT_TIMESTAMPデータ型またはTT_DATEデータ型を使用してエージング列を定義できます。TT_DATEデータ型を選択する場合は、LIFETIME単位としてDAYSを指定する必要があります。

AS SelectQuery句を指定する場合は、作成する表にColumnNameを定義する必要があります。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「表へのエージング・ポリシーの実装」を参照してください。

LIFETIME Num1 {SECOND[S]| MINUTE[S]|HOUR[S]| DAY[S]}

LIFETIMEは時間ベースのエージング属性で、必須の句です。

AGING USE ColumnName句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。エージング列をTT_DATEデータ型を使用して定義する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

[CYCLE Num2 {SECOND[S] |MINUTE[S]|HOUR[S]| DAY[S]}]

CYCLEは時間ベースのエージング属性で、オプションです。LIFETIME句の後にCYCLE句を指定します。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

AS SelectQuery

指定すると、SelectQueryの結果セットの内容から新しい表が作成されます。SelectQueryで返される行が表に挿入されます。

データ型およびデータ型の長さは、SelectQueryから導出されます。

SelectQueryは、副問合せを含めることも含めないこともできる有効なSELECT文です。SELECT文の詳細は、「SELECT」を参照してください。

SELECT動詞の後に文レベルのオプティマイザ・ヒントを指定できます。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

列定義: TimesTen Classic

SQL構文

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

LOB以外のすべてのデータ型について、構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal]
 [[NOT] INLINE]
 [PRIMARY KEY | UNIQUE | 
 NULL [UNIQUE] | 
 NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] 
]

LOBデータ型の場合、LOB列に主キーまたは一意制約を作成できません。また、LOBデータ型は表外に格納されるため、INLINE属性を指定できません。

LOBデータ型は、TimesTen Scaleoutではサポートされていません。

すべてのLOBデータ型について、構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal] [[NOT] NULL [ENABLE]] |
 [[NOT] NULL [ENABLE]] [DEFAULT DefaultVal]

パラメータ

列定義には、次のパラメータがあります。

パラメータ 説明

ColumnName

新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。

AS SelectQuery句を指定する場合、ColumnNameはオプションです。列名の数は、SelectQueryの列の数と一致している必要があります。

ColumnDataType

列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

AS SelectQuery句を指定する場合、ColumnDataTypeは指定しないでください。

DEFAULT DefaultVal

INSERT文で列の値が指定されていない場合は、列にデフォルト値DefaultValを挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。ROWIDデータ型について、または読取り専用キャッシュ・グループの列についてデフォルト値を割り当てることはできません。また、DEFAULT句でファンクションを使用することはできません。

DefaultValでは、次のデータ型がサポートされます。

デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHAR2のいずれかであり、列の幅は30文字以上である必要があります。

AS SelectQuery句を指定する場合は、オプションで、作成する表にDEFAULT句を指定することもできます。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にINLINE | NOT INLINE句を指定することもできます。

NULL

列にNULL値を含めることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNULLを指定することもできます。

NULLを指定した場合は、ENABLEを指定できません。

NOT NULL [ENABLE]

列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNOT NULL[ENABLE]を指定することもできます。

NOT NULLを指定する場合は、オプションでENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

UNIQUE

列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。PRIMARY KEYとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にUNIQUEを指定することもできます。

PRIMARY KEY

列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。UNIQUEとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にPRIMARY KEYを指定することもできます。

CREATE TABLEの説明: TimesTen Classic

  • 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。
  • 主キーに保存されるすべての列は、NOT NULLである必要があります。

  • ColumnDefinitionで指定されたPRIMARY KEYは、1つの列に対してのみ指定できます。

  • PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

  • 主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。

  • 主キー列は、列を同じ値に更新する以外の更新はできません。

  • インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。

    • TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。

    • TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。

    • TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。

    • 列を保存するとオーバーヘッドが少なくなります。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • キャッシュ表を参照する外部キーを持つ表は作成できません。

  • UNIQUE列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。

  • 表の主キーで使用する索引を変更するには、ALTER TABLE文を使用します。

  • AS SelectQuery句を指定する場合:

    • データ型およびデータ型の長さは、SelectQueryから導出されます。作成する表の列にデータ型を指定しないでください。

    • SelectQueryで列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL制約を定義します。

    • 選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていたNOT NULL制約は、新しい表に引き継がれます。選択した表のNOT NULL制約を無効にするには、新しい列をNULLとして定義します。次に例を示します:

      CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
      
    • NOT INLINE/INLINE属性は新しい表に引き継がれます。

    • 一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。

    • SelectQueryのすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQueryの列と同じです。SelectQueryに単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE文で列に名前を付けます。

    • 作成する表に対して外部キーを指定しないでください。

    • SelectQuerySELECT FOR UPDATEを指定しないでください。

    • AS SelectQuery句を使用する場合、ORDER BY句はサポートされません。

    • SelectQueryに集合演算子UNIONMINUSおよびINTERSECTを含めることはできません。

    • レプリケートされた環境では、次のことに注意してください。

      グローバル一時表を含む新しい表の作成時に表をアクティブ・スタンバイ・ペアに含めるには、アクティブ・データベースでCREATE TABLE文を実行する前に、DDL_REPLICATION_LEVELを2以上に設定し、DDL_REPLICATION_ACTIONINCLUDEに設定します。この構成では、表はアクティブ・スタンバイ・ペアに含まれ、レプリケーション・スキームのすべてのデータベースにレプリケートされます。

      DDL_REPLICATION_ACTIONEXCLUDEに設定した場合、新しい表は、アクティブ・スタンバイ・ペアに含まれませんが、レプリケーション・スキームのすべてのデータベースにレプリケートされます。表はレプリケーション・スキームの一部にはならないため、その表で発行されたDMLはレプリケートされません。表に対してDMLレプリケーションを有効にするには、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE文を実行して、表を含める必要があります。この場合、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLEを実行すると表の内容は切り捨てられるため、この文を実行する前に、表は空であり、すべてのデータベースに存在している必要があります。

      詳細は、「ALTER SESSION」を参照してください。

  • デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、UNIQUE HASH句を使用してください。

    • アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、その表に対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。

  • ハッシュ索引は、表が存在している間、ALTER TABLE文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。

    ハッシュ索引のサイズが適性に設定されていることを確認するには、SET PAGES句のRowPagesパラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

  • ハッシュ・キーには、最大16列を指定できます。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

    • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADEには、次の規則も適用されます。

    • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • レプリケーションを含むON DELETE CASCADE: 次の制限が適用されます。

    • ON DELETE CASCADEで指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。

    • カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかにON DELETE CASCADE付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。

    • レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止する必要があります。

  • グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • 1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、すべての表のCYCLE句に指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT ... SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • エージング状態にかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • エージングの制限:

    • LRUエージングと時間ベースのエージングは、マテリアライズド・ビューのディテール表ではサポートされていません。

    • LRUエージングと時間ベースのエージングは、グローバル一時表ではサポートされていません。

    • 時間ベースのエージングに使用されている列は削除できません。

    • エージング・ポリシーとエージング状態は、すべてのレプリケーション・サイトで同じである必要があります。

    • 外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。

    • LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

    • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

表の列ベースの圧縮(TimesTen Classic)

データをより効率的に格納する列レベルで表を圧縮できます。これは、列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。

表の圧縮される1つ以上の列(圧縮列グループと呼ばれる)を定義できます。各表に1つ以上の圧縮列グループを定義できます。

各圧縮列グループに対して、圧縮列グループのすべての個別値の列を含むディクショナリ表が作成されます。圧縮列グループには、ディクショナリ表の適切な値の行へのポインタが含まれます。このポインタの幅は、ディクショナリ表に対して定義した最大エントリ数に応じて、1、2または4バイトです。そのため、圧縮されている列グループ内の列の幅の合計が、1、2または4バイトのポインタの幅より広い場合、およびこれらの列値に多くの重複する値が存在する場合は、表で使用される領域を削減しました。

図6-1に、ディクショナリ表の適切な行を指している、表の圧縮列グループを示します。

図6-1 列ベースの圧縮

図6-1の説明を次に示します
「図6-1 列ベースの圧縮」の説明

ディクショナリ表には、各個別値へのポインタの列があります。ユーザーが圧縮列グループの個別エントリの最大数を構成すると、圧縮列グループのサイズが次のように設定されます。

  • エントリの最大数が255(28-1)の場合は1バイト。最大数が1から255の場合、ディクショナリのサイズは255(28-1)に設定され、圧縮列グループのポインタ列は1バイトになります。

  • エントリの最大数が65,535(216-1)の場合は2バイト。最大数が256から65,535の場合、ディクショナリのサイズは65,535(216-1)に設定され、圧縮列グループのポインタ列は2バイトになります。

  • エントリの最大数が4,294,967,295(232-1)の場合は4バイト。最大数が65,536から4,294,967,295の場合、ディクショナリのサイズは4,294,967,295(232-1)に設定され、圧縮列グループのポインタ列は4バイトになります。これがデフォルトです。

構文: 列ベースの圧縮(TimesTen Classic)

ColumnBasedCompressionの構文は、次のとおりです。

[COMPRESS (CompressColumns [,...])]

CompressColumnsの構文は次のとおりです。

{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY 
   [MAXVALUES = CompressMax]

パラメータ

ColumnBasedCompression構文には、次のパラメータがあります。

パラメータ 説明

COMPRESS (CompressColumns [,...])

圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。ただし、1つの列は1つの圧縮列グループにのみ含めることができます。

圧縮列グループで複数の列を指定する場合、INLINE列のみがサポートされます。アウトライン列は、複数列圧縮グループに指定できません。

各圧縮列グループは、最大16列に制限されます。

BY DICTIONARY

各圧縮列グループの圧縮ディクショナリを定義します。

MAXVALUES = CompressMax

CompressMaxは、表の個別値の合計数であり、圧縮列グループ・ポインタ列のサイズを1、2または4バイトに設定し、ディクショナリ表のエントリの最大数のサイズを設定します。

ディクショナリ表の場合、NULLは1つの一意の値としてカウントされます。

CompressMaxは、1から429497295 (232-1)までの整数です。

MAXVALUES句を省略した場合の最大サイズのデフォルトは232-1であり、ポインタ列に4バイトが使用されます。値が232-1よりも大きい場合は、エラーがスローされます。

説明: 列ベースの圧縮(TimesTen Classic)

  • 圧縮列グループは、表の作成時に追加するか、ALTER TABLE文を使用して後で追加できます。ALTER TABLE文を使用して、圧縮列グループを削除できますが、グループ全体を削除する必要があります。

  • 表のすべての列および個別の圧縮列グループに存在する列に索引を作成できます。ただし、一意の列または単一列主キーに単一列圧縮グループを作成することはできません。すべての索引または主キーが同じ圧縮グループに存在する場合も、一意の索引または主キーを作成することはできません。

  • LOB列は圧縮できません。

  • レプリケートされた表、キャッシュ・グループ表またはグローバル一時表の列では、圧縮はサポートされません。CREATE TABLE AS SELECT文を使用し、その文でその表に対して列ベースの圧縮を定義すると、表を作成できません。

  • 圧縮が有効な表では、マテリアライズド・ビューを作成できません。

  • 列ベースの圧縮は、TimesTen Scaleoutではサポートされていません。

例: TimesTen Classic

範囲索引がpartnumberに対して作成されます(主キーであるため)。

Command> CREATE TABLE price
          (partnumber INTEGER NOT NULL PRIMARY KEY,
           vendornumber INTEGER NOT NULL,
           vendpartnum CHAR(20) NOT NULL,
           unitprice DECIMAL(10,2),
           deliverydays SMALLINT,
           discountqty SMALLINT);
Command> INDEXES price;
Indexes on table SAMPLEUSER.PRICE:
 PRICE: unique range index on columns:
    PARTNUMBER
  1 index found.
1 index found on 1 table.

ハッシュ索引は、主キーであるclubname列に作成されます。

CREATE TABLE recreation.clubs
(clubname CHAR(15) NOT NULL PRIMARY KEY,
 clubphone SMALLINT,
 activity CHAR(18))
UNIQUE HASH ON (clubname) PAGES = 30;

範囲索引は、membernameおよびclubの2つの列で作成されます(ともに主キーであるため)。

Command> CREATE TABLE recreation.members
          (membername CHAR(20) NOT NULL,
           club CHAR(15) NOT NULL,
           memberphone SMALLINT,
           PRIMARY KEY (membername, club));
Command> INDEXES recreation.members;
Indexes on table RECREATION.MEMBERS:
  MEMBERS: unique range index on columns:
    MEMBERNAME
    CLUB
  1 index found on 1 table.

recreation.events表にはハッシュ索引は作成されません。

CREATE TABLE recreation.events
(sponsorclub CHAR(15),
 event CHAR(30),
 coordinator CHAR(20),
 results VARBINARY(10000));

ハッシュ索引は、vendornumber列に作成されます。

CREATE TABLE purchasing.vendors
(vendornumber INTEGER NOT NULL PRIMARY KEY,
 vendorname CHAR(30) NOT NULL,
 contactname CHAR(30),
 phonenumber CHAR(15),
 vendorstreet CHAR(30) NOT NULL,
 vendorcity CHAR(20) NOT NULL,
 vendorstate CHAR(2) NOT NULL,
 vendorzipcode CHAR(10) NOT NULL,
 vendorremarks VARCHAR(60))
UNIQUE HASH ON (vendornumber) PAGES = 101;

ハッシュ索引は、membername列およびclub列で作成されます(ともに主キーであるため)。

CREATE TABLE recreation.members
    (membername CHAR(20) NOT NULL,
        club CHAR(15) NOT NULL,
        memberphone SMALLINT,
        PRIMARY KEY (membername, club))
    UNIQUE HASH ON (membername, club) PAGES = 100;

ハッシュ索引は、firstname列およびlastname列に作成されます(ともにauthors表の主キーであるため)。外部キーは、authors表の主キーを参照するbooks表のauthorfirstnameauthorlastname列に作成されます。

CREATE TABLE authors
    (firstname VARCHAR(255) NOT NULL,
        lastname VARCHAR(255) NOT NULL,
        description VARCHAR(2000),
        PRIMARY KEY (firstname, lastname))
    UNIQUE HASH ON (firstname, lastname) PAGES=20;
CREATE TABLE books
    (title VARCHAR(100),
    authorfirstname VARCHAR(255),
    authorlastname VARCHAR(255),
    price DECIMAL(5,2),
    FOREIGN KEY (authorfirstname, authorlastname) 
    REFERENCES authors(firstname, lastname));

次の文では、VARCHAR列のデフォルト文字を上書きし、1つのVARCHAR (10)列がNOT INLINEで、1つのVARCHAR (144)INLINEである表が作成されます。

CREATE TABLE t1
    (c1 VARCHAR(10) NOT INLINE NOT NULL,
    c2 VARCHAR(144) INLINE NOT NULL);

次の文では、本のタイトルのUNIQUE列を持つ表が作成されます。

CREATE TABLE books
    (title VARCHAR(100) UNIQUE,
        authorfirstname VARCHAR(255),
        authorlastname VARCHAR(255),
        price DECIMAL(5,2),
        FOREIGN KEY (authorfirstname, authorlastname)
        REFERENCES authors(firstname, lastname));

次の文では、列x1のデフォルト値が1で、列dのデフォルト値がSYSDATEである表が作成されます。

CREATE TABLE t1
    (x1 INT DEFAULT 1, d TIMESTAMP DEFAULT SYSDATE);

この例では、rangex表を作成し、主キーとしてcol1を定義します。デフォルトで範囲索引が作成されます。

Command> CREATE TABLE rangex (col1 TT_INTEGER PRIMARY KEY);
Command> INDEXES rangex;
Indexes on table SAMPLEUSER.RANGEX:
  RANGEX: unique range index on columns:
    COL1
  1 index found
1 index found on 1 table.

次の文は、HRスキーマの親表および子表におけるON DELETE CASCADE句の使用を示しています。外部キーを持つ表は、ON DELETE CASCADEが有効になるように変更されています。

ALTER TABLE countries
ADD CONSTRAINT countr_reg_fk
         FOREIGN KEY (region_id)
           REFERENCES regions(region_id) ON DELETE CASCADE;
ALTER TABLE locations
     ADD CONSTRAINT loc_c_id_fk
          FOREIGN KEY (country_id)
          	  REFERENCES countries(country_id) ON DELETE CASCADE;
ALTER TABLE departments
     ADD CONSTRAINT dept_loc_fk
         FOREIGN KEY (location_id)
           REFERENCES locations (location_id) ON DELETE CASCADE;
ALTER TABLE employees
     ADD CONSTRAINT     emp_dept_fk
         FOREIGN KEY (department_id)
           REFERENCES departments ON DELETE CASCADE;
ALTER TABLE employees
     ADD CONSTRAINT     emp_job_fk
         FOREIGN KEY (job_id)
           REFERENCES jobs (job_id);
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_job_fk
         FOREIGN KEY (job_id)
           REFERENCES jobs;
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_emp_fk
         FOREIGN KEY (employee_id)
           REFERENCES employees ON DELETE CASCADE;
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_dept_fk
         FOREIGN KEY (department_id)
           REFERENCES departments ON DELETE CASCADE;
     ;

この例は、エージングにおいて、時間の単位がどのように機能するかを示しています。

存続時間が3 Daysの場合(単位はDay):

  • (SYSDATE - ColumnValue) <= 3の場合、エージ・アウトされません。

  • (SYSDATE - ColumnValue) > 3の場合、行はエージ・アウトの対象になります。

  • (SYSDATE - ColumnValue) = 3 days, 22 hoursの場合、存続期間を3 Daysに指定すると、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。

この例では、LRUエージングを使用して表を作成します。エージング状態は、デフォルトでONになっています。

CREATE TABLE agingdemo
       (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20)
       )
       AGING LRU;
Command> DESCRIBE agingdemo;
Table USER.AGINGDEMO:
  Columns:
     *AGINGID NUMBER NOT NULL
     NAME VARCHAR2 (20) INLINE
     AGING LRU ON
1 table found.
(primary key columns are indicated with *)

この例では、時間ベースのエージングを使用する表を作成します。存続期間は3 Daysです。サイクルは指定されていないため、デフォルトで5分です。エージング状態はOFFです。

CREATE TABLE agingdemo2
       (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20),
        agingcolumn TIMESTAMP NOT NULL
        )
        AGING USE agingcolumn LIFETIME 3 DAYS OFF;
Command> DESCRIBE agingdemo2;
Table USER.AGINGDEMO2:
  Columns:
     *AGINGID NUMBER NOT NULL
     NAME VARCHAR2 (20) INLINE
     AGINGCOLUMN TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 3 days cycle 5 minutes off
1 table found.
(primary key columns are indicated with *)

この例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE agingdemo2
        (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20),
        agingcolumn TIMESTAMP NOT NULL
        )
        AGING USE agingcolumn LIFETIME 3 DAYS OFF;
ALTER TABLE agingdemo2
        ADD AGING LRU;
 2980: Cannot add aging policy to a table with an existing aging policy. Have to
drop the old aging first
The command failed.
DROP aging on the table and redefine with LRU aging.
ALTER TABLE agingdemo2
        DROP AGING;
ALTER TABLE agingdemo2
        ADD AGING LRU;
Command> DESCRIBE agingdemo2;
Table USER.AGINGDEMO2:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging lru on
1 table found.
(primary key columns are indicated with *)

時間ベースのエージングを指定して表を作成してみます。TT_DATEデータ型と3時間のLIFETIMEを指定してエージング列を定義します。LIFETIME単位はDAYSで指定する必要があるため、エラーが生成されます。

Command> CREATE TABLE aging1 (col1 TT_INTEGER PRIMARY KEY, 
         col2 TT_DATE NOT NULL) AGING USE col2 LIFETIME 3 HOURS;
 2977: Only DAY lifetime unit is allowed with a TT_DATE column
The command failed.

AS SelectQuery句を使用して、表empを作成します。employees表から、employee_idが100から105までのlast_nameを選択します。empに6行が挿入されたことが示されます。返される必要のある行を確認するために、最初にSELECT文を発行します。

Command> SELECT last_name FROM employees 
         WHERE employee_id BETWEEN 100 AND 105;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
< Austin >
6 rows found.
Command> CREATE TABLE emp AS SELECT last_name FROM employees
         WHERE employee_id BETWEEN 100 AND 105;
6 rows inserted.
Command> SELECT * FROM emp;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
< Austin >
6 rows found.

AS SelectQueryを使用して、表totalsalを作成します。salaryを合計して、結果をtotalsalaryに挿入します。SelectQuery式の別名sを定義します。

Command> CREATE TABLE totalsal AS SELECT SUM (salary) s FROM employees;
1 row inserted.
Command> SELECT * FROM totalsal;
< 691400 >
1 row found.

AS SelectQueryを使用して、commission_pct列で定義された表を作成します。デフォルト値を.3に設定します。最初に、commission_pct列がNUMBER (2,2)型であることを示すためにemployees表にDESCRIBEを実行します。c_pct表のcommission_pct列は、employees表のcommission_pct列からNUMBER (2,2)型を継承します。

Command> DESCRIBE employees;
Table SAMPLEUSER.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE UNIQUE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)

1 table found.
(primary key columns are indicated with *)
Command> CREATE TABLE c_pct (commission_pct DEFAULT .3) AS SELECT
         commission_pct FROM employees;
107 rows inserted.
Command> DESCRIBE c_pct;

Table SAMPLEUSER.C_PCT:
  Columns:
    COMMISSION_PCT                 NUMBER (2,2) DEFAULT .3

1 table found.
(primary key columns are indicated with *)

次の例では、job_idが圧縮されたemployees表を作成します。

Command> CREATE TABLE EMPLOYEES
          (EMPLOYEE_ID NUMBER (6) PRIMARY KEY, 
           FIRST_NAME VARCHAR2(20), 
           LAST_NAME VARCHAR2(25) NOT NULL, 
           EMAIL VARCHAR2(25) NOT NULL, 
           PHONE_NUMBER VARCHAR2(20),
           HIRE_DATE DATE NOT NULL, 
           JOB_ID VARCHAR2(10) NOT NULL, 
           SALARY NUMBER (8,2), 
           COMMISSION_PCT NUMBER (2,2), 
           MANAGER_ID NUMBER(6), 
           DEPARTMENT_ID NUMBER(4)) 
          COMPRESS (JOB_ID BY DICTIONARY);

Command> DESCRIBE EMPLOYEES;
 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
  COMPRESS ( JOB_ID BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

次の例では、ディクショナリ表に3つのサイズがあることを示します。エントリの最大数に指定した値は、次のサイズに丸められます。たとえば、役職IDの最大数として400を指定すると、最大で65535エントリのディクショナリ表が作成されます。デフォルトのサイズである232-1は、DESCRIBEの出力に表示されません。

Command> CREATE TABLE employees 
          (employee_id NUMBER(6) PRIMARY KEY, 
           first_name VARCHAR2(20), 
           last_name VARCHAR2(25), 
           email VARCHAR2(25) NOT NULL, 
           job_id VARCHAR2(10) NOT NULL, 
           manager_id NUMBER(6), 
           department_id NUMBER(4)) 
          COMPRESS (last_name BY DICTIONARY MAXVALUES=70000, 
             job_id BY DICTIONARY MAXVALUES=400, 
             department_id BY DICTIONARY MAXVALUES=100);

Command> DESCRIBE employees;
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE
    EMAILS                          VARCHAR2 (25) INLINE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
  COMPRESS ( LAST_NAME BY DICTIONARY,
             JOB_ID BY DICTIONARY MAXVALUES=65535,
             DEPARTMENT_ID BY DICTIONARY MAXVALUES=255 )
 
1 table found.
(primary key columns are indicated with *)