Dil*_*aev 2 oracle performance insert oracle10g
(数据库:Oracle 10G R2)
将100,000条记录插入表格需要1分钟.但是如果表已经包含一些记录(400K),则需要4分12秒; CPU等待也会跳起来,"Free Buffer Waits"变得非常高(来自dbconsole).
你知道在这里讨价还价吗?这是因为频繁的表范围?这些表的范围大小为1,048,576字节.我有一种感觉DB正在尝试扩展表存储.
我真的很困惑.所以任何帮助都会很棒!
这是insert语句:
begin
for i in 1 .. 100000 loop
insert into customer
(id, business_name, address1,
address2, city,
zip, state, country, fax,
phone, email
)
values (customer_seq.nextval, dbms_random.string ('A', 20), dbms_random.string ('A', 20),
dbms_random.string ('A', 20), dbms_random.string ('A', 20),
trunc (dbms_random.value (10000, 99999)), 'CA', 'US', '798-779-7987',
'798-779-7987', 'asdfasf@asfasf.com'
);
end loop;
end;
这里dstat输出(CPU,IO,MEMORY,NET):
输出来自 v$buffer_pool_statistics
ID: 3 NAME: DEFAULT BLOCK_SIZE: 8192 SET_MSIZE: 4446 CNUM_REPL: 4446 CNUM_WRITE: 0 CNUM_SET: 4446 BUF_GOT: 1407656 SUM_WRITE: 1244533 SUM_SCAN: 0 FREE_BUFFER_WAIT: 93314 WRITE_COMPLETE_WAIT: 832 BUFFER_BUSY_WAIT: 788 FREE_BUFFER_INSPECTED: 2141883 DIRTY_BUFFERS_INSPECTED: 1030570 DB_BLOCK_CHANGE: 44445969 DB_BLOCK_GETS: 44866836 CONSISTENT_GETS: 8195371 PHYSICAL_READS: 930646 PHYSICAL_WRITES: 1244533
UPDATE
我将索引从表中删除,即使将100K插入600K记录表(在没有CPU等待的情况下花了47秒 - 请参阅dstat输出http://pastebin.com/fbaccb10),性能也得到了极大的提升.
不确定这在Oracle中是否相同,但在SQL Server中,我要检查的第一件事是你在表上有多少索引.如果这是很多的话,数据库必须做很多工作,在插入记录时重新索引表.重新索引500k行比100k更难.