นี่เป็นเพียงเพื่อแสดงให้เห็นถึงการใช้งานซ้ำของinsert
การดำเนินการต่างๆมากกว่าที่จะตอบคำถามทั้งหมด ผลลัพธ์ในอินสแตนซ์ 10g ของฉันไม่ได้กำหนด 100% แต่ภาพกว้างยังคงเหมือนเดิมทุกครั้งที่ฉันวิ่งผ่าน
สำหรับตารางฮีปฉันไม่ทราบว่าเพราะเหตุใดจึงinsert /*+ append */
สร้างการทำซ้ำเพิ่มเติม
testbed:
create table heap_noappend(id integer, dummy char(500));
create table heap_append(id integer, dummy char(500));
create global temporary table gtt_noappend(id integer, dummy char(500));
create global temporary table gtt_append(id integer, dummy char(500));
create global temporary table gtt_results(stage integer, val integer);
ทดสอบ:
insert into gtt_results(stage, val)
select 0, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert into heap_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 1, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert /*+ append */ into heap_append(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 2, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert into gtt_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 3, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert /*+ append */ into gtt_append(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 4, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
ผลลัพธ์:
select *
from( select decode(stage,1,'heap noappend',
2,'heap append',
3,'gtt noappend',
4,'gtt append') as operation,
val-lag(val) over(order by stage) as redo
from gtt_results)
where redo is not null;
OPERATION REDO
------------- ----------------------
heap noappend 606932
heap append 690768
gtt noappend 41488
gtt append 256
insert
ops สร้างการเลิกทำน้อยกว่าdelete
หรือupdate
ops มาก (แทบจะไม่มีเลย) การมีหลาย gtts เพื่อหลีกเลี่ยง ops แพง ๆ อาจเป็นวิธีที่ดี