説明
このステートメントは、データベースに新しいテーブルを作成するために使用します。
構文
CREATE [hint_options] [GLOBAL TEMPORARY] TABLE table_name
(table_definition_list) [table_option_list] [partition_option] [on_commit_option]
CREATE [GLOBAL TEMPORARY] TABLE table_name
(table_definition_list) [table_option_list] [partition_option] [[MERGE_ENGINE = {delete_insert | partial_update}] table_column_group_option] [AS] select;
table_definition_list:
table_definition [, table_definition ...]
table_definition:
column_definition
| [,
| [CONSTRAINT [constraint_name]] { PRIMARY KEY|UNIQUE } (column_name) //すべての列を作成後に制約を追加
| [CONSTRAINT [constraint_name]] FOREIGN KEY (column_name, column_name ...) references_clause constraint_state
| [CONSTRAINT [constraint_name]] CHECK(expression) constraint_state
]
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[VISIBLE | INVISIBLE] [GENERATED BY DEFAULT AS IDENTITY | GENERATED ALWAYS AS IDENTITY]
{
[DEFAULT expression]
[NULL | NOT NULL]
[CONSTRAINT [constraint_name]] [ PRIMARY KEY|UNIQUE ] //列を作成時に制約を追加
[CONSTRAINT [constraint_name] CHECK(expression) constraint_state]
[CONSTRAINT [constraint_name] references_clause]
|
[GENERATED ALWAYS] AS (expression) [VIRTUAL]
[NULL | NOT NULL] [UNIQUE KEY] [[PRIMARY] KEY] [UNIQUE LOWER_KEY] [SKIP_INDEX(skip_index_option_list)]
}
skip_index_option_list:
skip_index_option [,skip_index_option ...]
skip_index_option:
MIN_MAX
| SUM
references_clause:
REFERENCES table_name [ (column_name, column_name ...) ] [ON DELETE {SET NULL | CASCADE}]
constraint_state:
[RELY | NORELY] [USING INDEX index_option_list] [ENABLE | DISABLE] [VALIDATE | NOVALIDATE]
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
table_option_list:
table_option [ table_option ...]
table_option:
TABLEGROUP = tablegroup_name
| block_size
| compression
| ENABLE ROW MOVEMENT
| DISABLE ROW MOVEMENT
| physical_attribute
| parallel_clause
| DUPLICATE_SCOPE [=] 'none|cluster'
| TABLE_MODE [=] 'table_mode_value'
| enable_macro_block_bloom_filter [=] {True | False}
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list)
| MICRO_BLOCK_FORMAT_VERSION [=] {1|2}
physical_attribute_list:
physical_attribute [physical_attribute]
physical_attribute:
PCTFREE [=] num
| PCTUSED num
| INITRANS num
| MAXTRANS num
| STORAGE(storage_option [storage_option] ...)
| TABLESPACE tablespace
parallel_clause:
{NOPARALLEL | PARALLEL integer}
table_mode_value:
NORMAL
| QUEUING
| MODERATE
| SUPER
| EXTREME
dynamic_partition_policy_list:
dynamic_partition_policy_option [, dynamic_partition_policy_option ...]
dynamic_partition_policy_option:
ENABLE = {true | false}
| TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| TIME_ZONE = {'default' | 'time_zone'}
| BIGINT_PRECISION = {'none' | 'us' | 'ms' | 's'}
compression:
NOCOMPRESS
| COMPRESS { BASIC | FOR OLTP | FOR QUERY [LOW | HIGH] | FOR ARCHIVE [LOW | HIGH]}
storage_option:
INITIAL num [K|M|G|T|P|E]
| NEXT num [K|M|G|T|P|E]
| MINEXTENTS num [K|M|G|T|P|E]
| MAXEXTENTS num [K|M|G|T|P|E]
partition_option:
PARTITION BY HASH(column_name_list)
[subpartition_option] hash_partition_define
| PARTITION BY RANGE (column_name_list)
[subpartition_option] (range_partition_list)
| PARTITION BY LIST (column_name_list)
[subpartition_option] (list_partition_list)
| PARTITION BY RANGE([column_name_list]) [SIZE('size_value')] [range_partition_list]
| PARTITION BY RANGE (column_name) INTERVAL (expr)
[subpartition_option]
(range_partition)
/*テンプレート型サブパーティション*/
subpartition_option:
SUBPARTITION BY HASH (column_name_list) hash_subpartition_define
| SUBPARTITION BY RANGE (column_name_list) SUBPARTITION TEMPLATE
(range_subpartition_list)
| SUBPARTITION BY LIST (column_name_list) SUBPARTITION TEMPLATE
(list_subpartition_list)
/*非テンプレート型サブパーティション*/
subpartition_option:
SUBPARTITION BY HASH (column_name_list)
| SUBPARTITION BY RANGE (column_name_list)
| SUBPARTITION BY LIST (column_name_list)
subpartition_list:
(hash_subpartition_list)
| (range_subpartition_list)
| (list_subpartition_list)
hash_partition_define:
PARTITIONS partition_count [TABLESPACE tablespace] [compression]
| (hash_partition_list)
hash_partition_list:
hash_partition [, hash_partition ...]
hash_partition:
partition [partition_name] [subpartition_list/*非テンプレート型サブパーティションのみ定義可能*/]
hash_subpartition_define:
SUBPARTITIONS subpartition_count
| SUBPARTITION TEMPLATE (hash_subpartition_list)
hash_subpartition_list:
hash_subpartition [, hash_subpartition ...]
hash_subpartition:
subpartition [subpartition_name]
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION [partition_name]
VALUES LESS THAN {(expression_list) | (MAXVALUE)}
[subpartition_list/*非テンプレート型サブパーティションのみ定義可能*/]
[ID = num] [physical_attribute_list] [compression]
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE} [physical_attribute_list]
list_partition_list:
list_partition [, list_partition] ...
list_partition:
PARTITION [partition_name]
VALUES (DEFAULT | expression_list)
[subpartition_list /*非テンプレート型サブパーティションのみ定義可能*/]
[ID num] [physical_attribute_list] [compression]
list_subpartition_list:
list_subpartition [, list_subpartition] ...
list_subpartition:
SUBPARTITION [partition_name] VALUES (DEFAULT | expression_list) [physical_attribute_list]
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
on_commit_option:
ON COMMIT DELETE ROWS
| ON COMMIT PRESERVE ROWS
table_column_group_option:
WITH COLUMN GROUP(all columns)
| WITH COLUMN GROUP(each column)
| WITH COLUMN GROUP(all columns, each column)
パラメータ説明
パラメータ |
説明 |
|---|---|
| hint_options | オプションです。Hintオプションを指定します。APPEND、DIRECT、NO_DIRECTを含むダイレクトロードHintの手動指定をサポートします。対応するHintの形式は/+ [APPEND | DIRECT(need_sort,max_error,load_type)] parallel(N)| NO_DIRECT/です。CREATE TABLE AS SELECTステートメントによるデータのダイレクトロードの詳細については、フルダイレクトロードのCREATE TABLE AS SELECTステートメントによるデータのダイレクトロードセクションを参照してください。 |
| GLOBAL TEMPORARY | このテーブルを一時テーブルとして作成します。 |
| DEFAULT expression | 列のデフォルト値を指定します。expressionはSequenceを含む関数式をサポートします。
注意自動インクリメント列にはデフォルト値を設定できません。 |
| BLOCK_SIZE | テーブルのマイクロブロックサイズを指定します。 |
| COMPRESSION | ストレージ形式Flat/Encodingおよび圧縮方法を指定します。対応は以下のとおりです:
|
| tablegroup_name | テーブルが属するTable Groupを指定します。 |
| FOREIGN KEY | 作成するテーブルに外部キーを指定します。外部キー名を指定しない場合、テーブル名 + OBFK + 作成日時が使用されます(例:2021年8月1日00:00:00にt1テーブルに作成された外部キー名はt1_OBFK_1627747200000000)。外部キーにより、テーブル間で関連データを相互参照できます。DELETE操作が子テーブルとマッチする行の親テーブル内のキー値に影響を与える場合、その結果はON DELETE句で指定された参照動作によって決まります:
|
| VISIBLE | 列が可視であることを示します。これがデフォルトの列の状態です。 |
| INVISIBLE | 列が不可視であることを示します。列をINVISIBLEに設定すると、クエリ時にその列はデフォルトで表示されません。 |
| GENERATED BY DEFAULT AS IDENTITY | GENERATED ALWAYS AS IDENTITY | オプションです。列を自動インクリメント列として指定します。詳細は以下のとおりです:
注意この列のデータ型は数値型でなければなりません。 |
| physical_attribute | PCTFREE: マクロブロックの予約領域の割合を指定します。その他の属性 STORAGE、TABLESPACE などは、構文互換性のための移行の便宜上のものであり、実際には機能しません。 |
| ENABLE/DISABLE ROW MOVEMENT | パーティションキーの更新のため、異なるパーティション間での移動を許可するかどうかを示します。 |
| ON COMMIT DELETE ROWS | トランザクションレベルの一時テーブルで、コミット時にデータを削除します。 |
| ON COMMIT PRESERVE ROWS | セッションレベルの一時テーブルで、セッション終了時にデータを削除します。 |
| parallel_clause | テーブルレベルの並列度を指定します:
注意並列度を指定する場合、優先順位は以下のとおりです:Hintによって指定された並列度 > |
| DUPLICATE_SCOPE | レプリケーションテーブルの属性を指定します。取り得る値は以下のとおりです:
cluster:このテーブルがレプリケーションテーブルであることを示します。Leaderは、トランザクションを現在のテナントのすべてのF(フル機能)レプリカおよびR(読み取り専用)レプリカに複製する必要があります。
cluster レベルのレプリケーションテーブルのみをサポートしています。 |
| MERGE_ENGINE = {delete_insert | partial_update} | オプションです。テーブルの更新モデルを指定するために使用されます。取り得る値は以下のとおりです:
説明パラメータ |
| table_column_group_option | テーブルのカラムストアオプションを指定します。具体的な説明は以下のとおりです:
|
| SKIP_INDEX | 列のSkip Indexプロパティを識別します。取り得る値は以下のとおりです:
注意
|
| TABLE_MODE | オプションです。メジャーコンパクションのトリガーしきい値とメジャーコンパクション戦略を指定するために使用され、データダンプ後のメジャーコンパクション動作を制御します。値の詳細については、以下の table_mode_value を参照してください。 |
| enable_macro_block_bloom_filter [=] {True | False} | マクロブロックレベルのBloomフィルターを永続化するかどうかを指定するために使用されます。取り得る値は以下のとおりです:
|
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | テーブルの動的パーティション管理属性を指定し、パーティションの自動作成と削除を実現します。dynamic_partition_policy_list は動的パーティション戦略の構成可能なパラメータリストで、各パラメータは半角カンマで区切られます。詳細については、以下の dynamic_partition_policy_option を参照してください。 |
| MICRO_BLOCK_FORMAT_VERSION | オプションです。テーブルのマイクロブロックストレージ形式のバージョン番号を指定するために使用されます。詳細は以下のとおりです:取り得る範囲は [1,+∞)
説明このパラメータはV4.4.1バージョンから導入されました。 |
| PARTITION BY RANGE([column_name_list]) [SIZE('size_value')] [range_partition_list] | 自動パーティションテーブルの作成を指定するために使用されます。詳細については、自動パーティションの分割 のテーブル作成時の自動パーティション構文を参照してください。
説明V4.4.2バージョンでは、V4.4.2 BP1バージョン以降、自動パーティションの分割のしきい値の下限が128MBから1MBに調整されました。 |
| PARTITION BY RANGE (column_name) INTERVAL (expr) [subpartition_option] (range_partition) | Interval型パーティションテーブルの作成を指定するために使用されます。詳細については、パーティションテーブルの作成 のInterval型パーティションテーブルの作成を参照してください。 |
table_mode_value
説明
以下にリストされている TABLE_MODE モードでは、NORMAL モードを除くすべてのモードが QUEUING テーブルを表します。この QUEUING テーブルは最も基本的なテーブルタイプであり、その後にリストされている数種類のモード(NORMALモードを除く)は、より積極的なメジャーコンパクション戦略の使用を示しています。
NORMAL:デフォルト値で、通常を意味します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は非常に低いです。QUEUING:このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は低いです。MODERATE:適度を意味します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は中程度です。SUPER:スーパーを意味します。このモードでは、データダンプ後にメジャーコンパクションがトリガーされる確率は高いです。EXTREME:エクストリームを意味します。このモードでは、ダンプ後にメジャーコンパクションがトリガーされる確率は高いです。
メジャーコンパクションの詳細については、アダプティブコンパクションを参照してください。
dynamic_partition_policy_option
ENABLE = {true | false}:オプションです。動的パーティション管理を有効にするかどうかを示します。変更可能です。値は以下のとおりです:true:デフォルト値で、動的パーティション管理を有効にすることを示します。false:動的パーティション管理を無効にすることを示します。
TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}:必須です。パーティションの時間単位、つまり自動的にパーティション境界を作成する間隔を示します。変更不可です。値は以下のとおりです:hour:時間ごとにパーティションを分割します。day:日ごとにパーティションを分割します。week:週(曜日)ごとにパーティションを分割します。month:月ごとにパーティションを分割します。year:年ごとにパーティションを分割します。
PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}:オプションです。事前作成時間を示します。動的パーティション管理を1回スケジュールすると、パーティションが事前作成され、最大パーティション上界 > now() + precreate_time となります。変更可能です。値は以下のとおりです:-1:デフォルト値で、パーティションを事前作成しないことを示します。0:現在のパーティションのみを事前作成することを示します。n {hour | day | week | month | year}:対応する時間範囲のパーティションを事前作成することを示します。例えば、3 hourは3時間以内のパーティションを事前作成することを意味します。
説明
- 複数のパーティションを事前作成する必要がある場合、パーティション境界の間隔は
TIME_UNITとなります。 - 最初に事前作成されるパーティションの境界は、既存の最大パーティション境界を
TIME_UNITで切り上げた値となります。
EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}:オプションです。パーティションの有効期限を示します。動的パーティション管理を1回スケジュールすると、すべての パーティション上界 < now() - expire_time の期限切れパーティションが削除されます。変更可能です。値は以下のとおりです:-1:デフォルト値で、パーティションは永遠に期限切れにならないことを示します。0:現在のパーティションを除く、それ以前のすべてのパーティションが期限切れになることを示します。n {hour | day | week | month | year}:パーティションの有効期限を示します。例えば、1 dayはパーティションの有効期限が1日であることを示します。
TIME_ZONE = {'default' | 'time_zone'}:オプションです。現在時刻と日付型(date、timestamp型)のパーティションキーの大きさを比較する際に依存するタイムゾーン情報を示します。変更不可です。値は以下のとおりです:default:デフォルト値で、タイムゾーンを追加で設定せず、テナントのタイムゾーンを使用することを示します。上記の型以外では、time_zoneフィールドはdefaultである必要があります。time_zone:カスタムタイムゾーンのオフセット値を示します。例えば、+8:00などのタイムゾーンオフセット値です。
BIGINT_PRECISION = {'none' | 'us' | 'ms' | 's'}:オプションです。number型のパーティションキーのタイムスタンプ精度を示します。変更不可です。値は以下のとおりです:none:デフォルト値で、精度がないことを示します(パーティションキーがnumber型ではない場合)。us:マイクロ秒精度。ms:ミリ秒精度。s:秒精度。
動的パーティションテーブルの作成に関する詳細は、動的パーティションテーブルの作成を参照してください。
例:
CREATE TABLE tbl2 (col1 INT, col2 TIMESTAMP)
DYNAMIC_PARTITION_POLICY(
ENABLE = true,
TIME_UNIT = 'hour',
PRECREATE_TIME = '3 hour',
EXPIRE_TIME = '1 day',
TIME_ZONE = '+8:00',
BIGINT_PRECISION = 'none')
PARTITION BY RANGE (col2)(
PARTITION P0 VALUES LESS THAN (TIMESTAMP '2024-11-11 13:30:00')
);
例
テーブル
TEST_TBL1を作成します。obclient> CREATE TABLE TEST_TBL1 (col1 INT PRIMARY KEY, col2 VARCHAR(50));テーブル
TEST_TBL2を作成し、Hashパーティションを8個作成します。obclient> CREATE TABLE TEST_TBL2 (col1 INT PRIMARY KEY, col2 INT) PARTITION BY HASH(col1) PARTITIONS 8;テーブル
TEST_TBL3を作成し、パーティションをRangeパーティションに、サブパーティションをHashパーティションに分割します。obclient> CREATE TABLE TEST_TBL3 (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY HASH(col2) SUBPARTITIONS 5 (PARTITION p0 VALUES LESS THAN(0), PARTITION p1 VALUES LESS THAN(100));テーブル
TEST_TBL4を作成し、Encodingを有効にしてzstd圧縮を使用し、マクロブロックの保持領域を5%に設定します。obclient> CREATE TABLE tbl6 (col1 INT, col2 INT, col3 VARCHAR(64)) COMPRESS FOR ARCHIVE PCTFREE 5;トランザクションレベルの一時テーブル
TEST_TBL5を作成します。obclient> CREATE GLOBAL TEMPORARY TABLE TEST_TBL5(col1 INT) ON COMMIT DELETE ROWS;制約を持つテーブル
TEST_TBL6を作成します。obclient> CREATE TABLE TEST_TBL6 (col1 INT, col2 INT, col3 INT,CONSTRAINT equal_check1 CHECK(col2 = col3 * 2) ENABLE VALIDATE);テーブル
REF_T2に外部キーを指定し、DELETE操作が子テーブルと一致する行の親テーブルのキー値に影響を与えた場合にSET NULL操作を実行します。obclient> CREATE TABLE REF_T1(c1 INT PRIMARY KEY,C2 INT);obclient> CREATE TABLE REF_T2(c1 INT PRIMARY KEY,C2 INT,FOREIGN KEY(c2) REFERENCES ref_t1(c1) ON DELETE SET NULL);非テンプレートのRange + Rangeサブパーティションテーブル
TEST_TBL7を作成します。obclient> CREATE TABLE TEST_TBL7 (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) ( PARTITION p0 VALUES LESS THAN(100) ( SUBPARTITION p0_r1 VALUES LESS THAN(2019), SUBPARTITION p0_r2 VALUES LESS THAN(2020), SUBPARTITION p0_r3 VALUES LESS THAN(2021) ), PARTITION p1 VALUES LESS THAN(200) ( SUBPARTITION p1_r1 VALUES LESS THAN(2019), SUBPARTITION p1_r2 VALUES LESS THAN(2020), SUBPARTITION p1_r3 VALUES LESS THAN(2021) ), PARTITION p2 VALUES LESS THAN(300) ( SUBPARTITION p2_r1 VALUES LESS THAN(2019), SUBPARTITION p2_r2 VALUES LESS THAN(2020), SUBPARTITION p2_r3 VALUES LESS THAN(2021) ) );テーブル
TEST_TBL8の並列度を3に設定します。obclient> CREATE TABLE TEST_TBL8(col1 INT PRIMARY KEY, col2 INT) PARALLEL 3;関数を使用して列のデフォルト値を定義します。
obclient> CREATE SEQUENCE SEQ_PERSONIPTVSEQ START WITH 1 MINVALUE 1 MAXVALUE 10 INCREMENT BY 2 NOCYCLE NOORDER CACHE 30;obclient> SELECT LPAD(SEQ_PERSONIPTVSEQ.NEXTVAL,18,TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;実行結果は次のとおりです:
+----------------------------------------------------------------------------+ | LPAD(SEQ_PERSONIPTVSEQ.NEXTVAL,18,TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS')) | +----------------------------------------------------------------------------+ | 2025-04-08 19:35:1 | +----------------------------------------------------------------------------+obclient> CREATE TABLE FUNC_DEFAULT_TEST ( OID NUMBER(20,0) DEFAULT LPAD(SEQ_PERSONIPTVSEQ.NEXTVAL,18,TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')) NOT NULL);clusterレベルのレプリケーションテーブルDUP_T1を作成します。通常のテーブルと同じように、このレプリケーションテーブルのデータに挿入、読み取り、書き込みを行います。読み取りリクエストについて、Proxyを使用した場合、そのリクエストは任意のOBServerノードにルーティングされる可能性があります。OBServerノードに直接接続した場合、ローカルのレプリカが読み取り可能であれば、そのOBServerノード上で読み取りリクエストが実行されます。obclient> CREATE TABLE DUP_T1(c1 int) DUPLICATE_SCOPE = 'cluster';obclient> INSERT INTO DUP_T1 VALUES(1);obclient> SELECT * FROM DUP_T1;実行結果は次のとおりです:
+------+ | C1 | +------+ | 1 | +------+カラムストアテーブル
TBL_CGを作成します。obclient> CREATE TABLE tbl1_cg (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(50)) WITH COLUMN GROUP(each column);テーブル作成時に列のSkip Indexプロパティを指定します。
obclient> CREATE TABLE TEST_INDEX( col1 NUMBER SKIP_INDEX(MIN_MAX, SUM), col2 FLOAT SKIP_INDEX(MIN_MAX), col3 VARCHAR2(1024) SKIP_INDEX(MIN_MAX), col4 CHAR(10) );テーブル
TEST_TBL9を作成します。このテーブルには整数型の列col1があり、この操作を5つの並列度で実行するよう指定します。また、新しいテーブルTEST_TBL8のデータ内容は、テーブルTEST_TBL8のクエリ結果から取得することを指定します。obclient> CREATE /*+ parallel(5) */ TABLE TEST_TBL9 (col1 NUMBER) AS SELECT col1 FROM TEST_TBL8;TEST_TBL10という名前のテーブルを作成します。列col1を自動インクリメント列に設定し、主キーとして指定します。obclient> CREATE TABLE TEST_TBL10 ( col1 INT GENERATED BY DEFAULT AS IDENTITY, col2 VARCHAR2(50), PRIMARY KEY (col1) );永続化マクロブロックレベルのbloom filterを有効にしたテーブル
tbを作成します。obclient> CREATE TABLE tb(c1 INT PRIMARY KEY, c2 INT) enable_macro_block_bloom_filter = True;テーブル
tbを作成し、新しいFlat行ストレージ形式(バージョン2)を有効にします。obclient> CREATE TABLE tb(c1 INT PRIMARY KEY, c2 INT) micro_block_format_version = 2;
Oracle互換モードにおけるグローバル一時テーブルの制限事項
- Oracle互換モードの一時テーブルは、多様な業務シナリオで実際に利用されており、基本的な正確性と機能性が保証されています。
- 一般的に一時テーブルを使用する主な目的は互換性の確保と業務改革の軽減です。業務シナリオが限定されており、一時テーブルのパフォーマンス要件が高くない場合に利用できます。ただし、業務シナリオを通常のテーブルに変更できる場合は、通常のテーブルを使用する方が望ましいです。
パフォーマンスと安定性
- 一時テーブルのSQL実行効率は通常テーブルと基本的に同じで、特別な利点はありません。
- 一時テーブルはトランザクション終了時やセッション切断時にデータのクリーンアップという追加作業が必要なため、オーバヘッドが発生します。
- ログイン時に行われる一時テーブルのチェックおよびクリーンアップ処理がログインスレッドに負荷をかけ、ログイン時間が長くなったり、最悪の場合はログインできなくなったりする可能性があります。
一時テーブルの作成
一時テーブルを作成すると、デフォルトでテーブル作成文がリライトされます:
- 主キーとして
SYS_SESSION_ID列を追加します。 - 通常列として
SYS_SESS_CREATE_TIMEを追加します。 SYS_SESSION_IDをパーティションキーとするHashパーティションテーブルを作成し、パーティション数は固定の16個になります。
例:
obclient> CREATE GLOBAL TEMPORARY TABLE TEST_TBL11(
c1 INT,
c2 INT,
PRIMARY KEY(c1)
);
は、以下の形式にリライトされます。
obclient> CREATE GLOBAL TEMPORARY TABLE TEST_TBL11(
SYS_SESSION_ID INT,
SYS_SESS_CREATE_TIME INT,
c1 INT,
c2 INT,
PRIMARY KEY(SYS_SESSION_ID, c1)
)
PARTITION BY HASH(SYS_SESSION_ID) PARTITIONS 16;
一時テーブルのDML/クエリ文
INSERT を実行する際、現在のセッションIDとセッション作成時間が SYS_SESSION_ID 列と SYS_SESS_CREATE_TIME にデフォルトで挿入されます。
UPDATE/DELETE/SELECT を実行する際、SQLリライトにより、一時テーブルを含む文にはデフォルトでフィルタ条件「SYS_SESSION_ID = 現在のセッション session_id」が追加されます。この条件により、SQLオプティマイザーはパーティションの絞り込みとクエリ範囲の抽出を行うことができます。
一時テーブルのデータクリーンアップ
ON COMMIT DELETE ROWSオプションの一時テーブル(トランザクション一時テーブル、デフォルトオプション)では、トランザクション終了時に新しいトランザクションを開始し、DELETEステートメントを実行して一時テーブルのデータを削除します。ON COMMIT PRESERVE ROWSオプションの一時テーブル(セッション一時テーブル)では、セッション切断時にDELETEステートメントを実行して一時テーブルのデータを削除します。- セッションIDが再利用される可能性があるため、OceanBaseデータベースV3.2.4 BP4およびそれ以前のバージョンでは、ログイン時に現在のセッションIDのデータをチェックし、必要に応じて追加のクリーンアップを行います。
- セッションIDが一意でないために行われるログインチェックとクリーンアップは、障害(クラスタへのログイン不可)を引き起こす可能性があります。
一時テーブルのルーティング
トランザクション一時テーブル (
ON COMMIT DELETE ROWS) トランザクション内での一時テーブルへのアクセスは、トランザクションを開始したノードにのみルーティングされます。セッション一時テーブル (
ON COMMIT PRESERVE ROWS) セッションが一時テーブルにアクセスすると、OBServerノードはProxyに通知し、Proxyはその後のリクエストを現在のセッションにのみ送信するようにします。
一時テーブルの削除
通常テーブルと同様に、DML実行時に DROP を同時に実行することができ、一時テーブルの全データが削除されます。これはOracleの動作とは異なり、Oracleではすべてのセッションが一時テーブルのリソースを保持しなくなるのを待ってから DROP できます。
機能間のサポート状況
機能 |
V3.2.4 BP4およびそれ以前のバージョンでサポートされているか |
V3.2.4 BP5以降のV3.2.x系バージョンでサポートされているか |
V4.2.0バージョンでサポートされているか |
|---|---|---|---|
| 異なるセッション間でのプランの共有 | No | No | Yes |
| ログイン時のチェックとクリーンアップのトリガー不要 | No | Yes | Yes |
MERGE INTO ステートメント |
No | No | Yes |
重大な問題の回避策
ログインできない場合
- 一時テーブル関連の業務を停止し、一時テーブルを削除するか、メジャーコンパクションを実行します。通常は自己回復しますが、それでも回復しない場合は、次のステップに進みます。
- ログインできないマシンを再起動します。
プランの再利用不可によるPL Cacheの膨張
例えば、PL定義に一時テーブルを含むステートメントがある場合:
obclient> CREATE OR REPLACE PROCEDURE PRO_1
AS
var1 VARCHAR2(100);
BEGIN
-- 動的SQLを使用して一時テーブルを作成
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE temp_table (
col1 VARCHAR2(100)
) ON COMMIT DROP';
-- 動的データ挿入
EXECUTE IMMEDIATE 'INSERT INTO temp_table VALUES (''xxx'')';
-- 動的クエリ
EXECUTE IMMEDIATE 'SELECT col1 FROM temp_table WHERE ROWNUM = 1' INTO var1;
DBMS_OUTPUT.PUT_LINE(var1);
END PRO_1;
/
異なるセッション間で一時テーブルへのアクセスが共有できないため、各セッションはこのProcedure PRO_1 を一度ずつコンパイルし、対応するCacheを生成する必要があり、安定性の問題を引き起こす可能性があります。一時テーブルのSQLを動的SQLに変更することで、この問題を回避できます。
故障時のデータクリーンアップが行われていない場合
故障時にデータが残留する可能性があり、現在自動的なクリーンアップ方法はありませんが、通常は使用に影響しません。残留データが多すぎる場合は、DROP 一時テーブルを実行し、再度作成することで解決できます。
Oracleテナント内の読み取り専用および読み書き可能なテーブル
Oracleテナントでは、CREATE TABLE を使用して READ ONLY および READ WRITE タイプのテーブルを作成できます。また、ALTER TABLE ステートメントを使用してテーブルの読み書き属性を変更することもできます。
注意
SUPER 権限を持つユーザーは関連操作を実行できません。通常ユーザーの使用を推奨します。
操作手順:
通常ユーザーを作成します:
CREATE USER test1 IDENTIFIED BY "12345";ユーザーに接続とテーブル作成権限を付与します:
GRANT CREATE SESSION TO test1; GRANT CREATE TABLE TO test1;通常ユーザーでOceanBaseデータベースに接続します:
obclient -hxxx.xx.xxx.xxx -P2881 -utest1@oracle001 -A読み取り専用テーブルを作成します:
CREATE TABLE tb_readonly1(id INT) READ ONLY;読み取り専用テーブルにデータを挿入しようとします(失敗が想定されます):
INSERT INTO tb_readonly1 VALUES (1); -- 期待されるエラー:ORA-00600: internal error code, arguments: -5235, The table 'TEST1.TB_READONLY1' is read only so it cannot execute this statement読み書き可能なテーブルを作成します:
CREATE TABLE tb_readwrite1(id INT) READ WRITE;読み書き可能なテーブルにデータを挿入します(成功が想定されます):
INSERT INTO tb_readwrite1 VALUES (99),(98); -- 期待される結果:Query OK, 2 rows affected (0.002 sec) -- Records: 2 Duplicates: 0 Warnings: 0読み書き可能なテーブルを読み取り専用テーブルに変換します:
ALTER TABLE tb_readwrite1 READ ONLY;変換後の読み取り専用テーブルにデータを挿入しようとします(失敗が想定されます):
INSERT INTO tb_readwrite1 VALUES (96),(97); -- 期待されるエラー:ORA-00600: internal error code, arguments: -5235, The table 'TEST1.TB_READWRITE1' is read only so it cannot execute this statement