oracle在插入数据的时候有2种方式:
1.如果在hwm前面存在空余的空间,数据将会直接在hwm(高水位线)前面空余的空间插入
同时将会受到数据完整性约束的影响。
[color=red]注意:在这里我还没有commit,我用select语句查看可以执行[/color]
2.direct-path insert 也就是直接插入的方式。它不会考虑hwm前面是否有空余的空间,它会直接在hwm后面直接插入。如果commit后会直接通过buffer cache 写进数据文件,它不会等带checkpoint的时候才写数据到数据文件。
这种方式有2种模式:serially(串行),parallel(并行)
a serially direct load
[color=red]注意:在这里我还没有commit的时候它是不可以select的,一旦我commit后就可以用select查看了[/color]
b. parallel direct load
1.如果在hwm前面存在空余的空间,数据将会直接在hwm(高水位线)前面空余的空间插入
同时将会受到数据完整性约束的影响。
SQL> create table bt as select * from all_objects where 1=0;
Table created.
SQL> select count(*) from all_objects;
COUNT(*)
----------
30645
SQL> insert into bt select * from all_objects;
30645 rows created.
SQL> select count(*) from bt;
COUNT(*)
----------
30645
[color=red]注意:在这里我还没有commit,我用select语句查看可以执行[/color]
2.direct-path insert 也就是直接插入的方式。它不会考虑hwm前面是否有空余的空间,它会直接在hwm后面直接插入。如果commit后会直接通过buffer cache 写进数据文件,它不会等带checkpoint的时候才写数据到数据文件。
这种方式有2种模式:serially(串行),parallel(并行)
a serially direct load
SQL> commit;
Commit complete.
SQL> select count(*) from bt;
COUNT(*)
----------
30645
SQL> insert /*+append */ into bt select * from all_objects;
30645 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from bt;
COUNT(*)
----------
61290
[color=red]注意:在这里我还没有commit的时候它是不可以select的,一旦我commit后就可以用select查看了[/color]
b. parallel direct load
--创建分区表
SQL> create table emp (empno number,empname varchar2(20))
2 partition by hash(empno)
3 (partition part1,
4 partition part2)
5 /
Table created
SQL> col object_name format a40
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
---------------------------------------- ------------------
EMP TABLE PARTITION
EMP TABLE PARTITION
EMP TABLE
T TABLE
--修改session打开并行
SQL> alter session enable parallel dml;
Session altered.
--parallel(u1.bt,2) 2表示打开2并行度
SQL> insert /*+parallel(u1.bt,2) */ into u1.bt nologging
2 select * from user_objects;
13925 rows created.
SQL> select count(*) from u1.bt;
COUNT(*)
----------
13925
SQL> commit;
Commit complete.
SQL> select count(*) from u1.bt;
COUNT(*)
----------
13925