在 oracle 中插入有两种模式:
- 传统插入:插入的时候使用表中已有的空闲空间,同时会经过buffer cache,在插入的过程中会维护引用完整性约束
- direct-path 插入:插入的时候不使用表中已有的空闲空间,直接在已有数据之后追加数据(直接在表的高水位线(HWM)以上插入), 经过buffer cache,直接插入数据文件,并且在插入的过程中不会维护引用完整性约束
可以通过使用 append hint 对insert select 语句使用 direct-path insert
LightDB 从23.4 开始支持 append hint, 但由于LightDB 不支持 direct-path insert, 因此即使使用了hint,也不会起效。目前只是为了兼容这种用法。
下面对使用方法举例:
示例
初始化
create table test_append(key1 int, key2 int, key3 int, key4 int);
create table test_append1(key1 int, key2 int, key3 int, key4 int);
insert into test_append1 values(1,2,3,4);
insert into test_append1 values(11,21,31,41);
insert into test_append1 values(111,211,311,411);
示例
lightdb@test_oracle_pg_hint_plan=# EXPLAIN (COSTS FALSE) insert/*+append */ into test_append select 1, 1, 1, 2 from dual;
LOG: lt_hint_plan:
used hint:
not used hint:
append
duplication hint:
error hint:
QUERY PLAN
-------------------------------
Insert on test_append @"lt#1"
-> Result
(2 rows)
lightdb@test_oracle_pg_hint_plan=# EXPLAIN (COSTS FALSE) insert/*+append */ into test_append select * from test_append1;
LOG: lt_hint_plan:
used hint:
not used hint:
append
duplication hint:
error hint:
QUERY PLAN
--------------------------------
Insert on test_append @"lt#1"
-> Seq Scan on test_append1
(2 rows)