Oracleのダイレクトパスインサートを試してみます。
DBバッファキャッシュを経由しない、REDOログを生成しないため、高速にデータを表にinsertすることが出来ます。
しかし、表に表ロックを掛けてしまう→他の更新、挿入などができなくなる。
HWM以上にデータをインサートする→表の使用効率が悪くなる。
・・・などのデメリットがあります。
恐らく初期データ移行なんかで利用するべきでしょう。
create bigfile tablespace TBS_BIG datafile '/data/tbs_big.dbf' size 500M;
create table TBL2 (col1 number, col2 varchar2(100)) segment creation immediate tablespace TBS_BIG;
SQL> insert into TBL2
2 select i+j,rpad(to_char(i+j),100,'A')
3 from (
4 with DATA2(j) as (
5 select 0 j from DUAL
6 union all
7 select j+1000 from DATA2 where j < 999000
8 )
9 select j from DATA2
10 ),
11 (
12 with DATA1(i) as (
13 select 1 i from DUAL
14 union all
15 select i+1 from DATA1 where i < 1000
16 )
17 select i from DATA1
18 );
1000000行が作成されました。
テスト用に100万行のデータが挿入された表を作成しました。
SQL> create table TBL3 as select * from TBL2;
表が作成されました。
経過: 00:00:17.04
例えば、create table ~ as select ~文で表から表へのコピーを行った場合は17秒で完了しました。
SQL> insert /*+APPEND */ into TBL3 select * from TBL2 ;
1000000行が作成されました。
経過: 00:00:11.84
ただし、ダイレクトパスインサート:insert文に「/*+APPEND */を」付与してinsertを実行した場合は、11秒で完了
明らかにダイレクトパスインサートの方が高速です。
そのメリットとデメリットを充分に考慮にいれて利用るべき機能です。
DBバッファキャッシュを経由しない、REDOログを生成しないため、高速にデータを表にinsertすることが出来ます。
しかし、表に表ロックを掛けてしまう→他の更新、挿入などができなくなる。
HWM以上にデータをインサートする→表の使用効率が悪くなる。
・・・などのデメリットがあります。
恐らく初期データ移行なんかで利用するべきでしょう。
create bigfile tablespace TBS_BIG datafile '/data/tbs_big.dbf' size 500M;
create table TBL2 (col1 number, col2 varchar2(100)) segment creation immediate tablespace TBS_BIG;
SQL> insert into TBL2
2 select i+j,rpad(to_char(i+j),100,'A')
3 from (
4 with DATA2(j) as (
5 select 0 j from DUAL
6 union all
7 select j+1000 from DATA2 where j < 999000
8 )
9 select j from DATA2
10 ),
11 (
12 with DATA1(i) as (
13 select 1 i from DUAL
14 union all
15 select i+1 from DATA1 where i < 1000
16 )
17 select i from DATA1
18 );
1000000行が作成されました。
テスト用に100万行のデータが挿入された表を作成しました。
SQL> create table TBL3 as select * from TBL2;
表が作成されました。
経過: 00:00:17.04
例えば、create table ~ as select ~文で表から表へのコピーを行った場合は17秒で完了しました。
SQL> insert /*+APPEND */ into TBL3 select * from TBL2 ;
1000000行が作成されました。
経過: 00:00:11.84
ただし、ダイレクトパスインサート:insert文に「/*+APPEND */を」付与してinsertを実行した場合は、11秒で完了
明らかにダイレクトパスインサートの方が高速です。
そのメリットとデメリットを充分に考慮にいれて利用るべき機能です。
コメント