説明
このステートメントは、データベース内に新しいテーブルを作成するために使用されます。
構文
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)
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]
/*テンプレート化されたサブパーティション*/
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オプションを指定します。ダイレクトロードHintの手動指定がサポートされており、APPEND、DIRECT、NO_DIRECTが含まれます。対応する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:このテーブルが複製テーブルであることを示します。リーダーは、トランザクションを現在のテナントのすべての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 filterを永続化するかどうかを指定します。値は以下のとおりです:
説明OceanBaseデータベースV4.3.5バージョンでは、 |
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | テーブルの動的パーティション管理プロパティを指定し、パーティションの自動作成と削除を実現します。dynamic_partition_policy_listは動的パーティションポリシーの構成可能なパラメータリストであり、各パラメータは英語のカンマで区切られています。詳細については、以下のdynamic_partition_policy_optionを参照してください。
説明OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP2バージョンからテーブルの動的パーティション管理プロパティの指定がサポートされています。 |
| PARTITION BY RANGE([column_name_list]) [SIZE('size_value')] [range_partition_list] | 自動パーティションテーブルの作成を指定するために使用されます。詳細については、自動パーティション分割のテーブル作成時の自動パーティション構文を参照してください。 |
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}'}:オプション。事前に作成する時間を示します。動的パーティション管理をスケジュールするたびに、最大パーティション上界 > 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}'}:オプション。パーティションの有効期限を示します。動的パーティション管理をスケジュールするたびに、パーティション上界 < 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);テーブル作成時にスキップインデックス属性を指定します。
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フィルターを有効にしたテーブル
tbを作成します。CREATE TABLE tb(c1 INT PRIMARY KEY, c2 INT) enable_macro_block_bloom_filter = True;
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 を実行する際、現在のセッションのSession IDとSession作成時間がデフォルトで 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ステートメントを実行して一時テーブルデータを削除します。- Session IDは再利用される可能性があるため、OceanBaseデータベースV3.2.4 BP4およびそれ以前のバージョンでは、ログイン時に現在のSession IDのデータをチェックし、必要に応じて追加のクリーンアップを行います。
- Session IDが一意ではないために行われるログインチェックおよびクリーンアップは、障害(クラスタへのログイン不可)を引き起こす可能性があります。
一時テーブルのルーティング
トランザクション一時テーブル(
ON COMMIT DELETE ROWS) トランザクション内での一時テーブルへのアクセスは、トランザクション開始ノードにのみルーティングされます。セッション一時テーブル(
ON COMMIT PRESERVE ROWS) セッションが一時テーブルにアクセスした後、OBServerノードはProxyに通知し、Proxyのその後のリクエストは現在のセッションにのみ送信されるようにします。
一時テーブルの削除
通常のテーブルと同様に、DML実行中に DROP を正常に実行すると、一時テーブルの全データが削除されます。これはOracleの動作とは異なり、OracleではすべてのSessionが一時テーブルリソースを保持しなくなってから DROP できます。
交差機能のサポート状況
| 機能 | V3.2.4 BP4およびそれ以前のバージョンでサポートされているか | V3.2.4 BP5およびV3.2.x以降のバージョンでサポートされているか | V4.2.0バージョンでサポートされているか |
|---|---|---|---|
| 異なるセッション間でプランを共有する | いいえ | いいえ | はい |
| ログイン時にチェックとクリーンアップをトリガーしない | いいえ | はい | はい |
MERGE INTO ステートメント |
いいえ | いいえ | はい |
重大な問題の回避策
ログインできない
- 一時テーブル関連の業務を停止し、一時テーブルを削除するかコンパクションを行うと、通常は自己回復可能です。それでも回復できない場合は、次のステップに進みます。
- ログインできないマシンを再起動します。
プランの再利用ができないため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