如果表有大量记录(400K)而不是空,则插入速度会慢4倍

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):

  1. 空表插入:http://pastebin.com/f40f50dbb
  2. 表有400K记录:http://pastebin.com/f48d8ebc7

输出来自 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),性能也得到了极大的提升.

Kyl*_*est 5

不确定这在Oracle中是否相同,但在SQL Server中,我要检查的第一件事是你在表上有多少索引.如果这是很多的话,数据库必须做很多工作,在插入记录时重新索引表.重新索引500k行比100k更难.