(数据库:Oracle 10G R2)
向表中插入 100,000 条记录需要 1 分钟。但是如果表已经包含一些记录(400K),那么需要4分12秒;CPU-wait 也跳了起来,“Free Buffer Waits”变得非常高(来自 dbconsole)。
你知道这里发生了什么吗?这是因为频繁的表范围吗?这些表的范围大小为 1,048,576 字节。我有一种感觉 DB 正在尝试扩展表存储。
我真的很困惑。所以任何帮助都会很棒!
这是插入语句:
开始 for i in 1 .. 100000 循环 插入客户 (id、企业名称、地址 1、 地址2,城市, 邮编,州,国家,传真, 电话、电子邮件 ) 值(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' ); 结束循环; 结尾;
这里的 dstat输出(CPU、IO、MEMORY、NET)为:
- 空表插入: http: //pastebin.com/f40f50dbb
- 包含 400K 记录的表:http: //pastebin.com/f48d8ebc7
输出自v$buffer_pool_statistics
编号:3 名称:默认 块大小:8192 SET_MSIZE:4446 CNUM_REPL:4446 CNUM_WRITE:0 CNUM_SET:4446 BUF_GOT:1407656 SUM_WRITE:1244533 总和扫描: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 一致获取:8195371 PHYSICAL_READS:930646 PHYSICAL_WRITES:1244533
更新
我从该表中删除了索引,即使将 100K 插入 600K 记录表(在没有 CPU 等待的情况下花费了 47 秒 - 请参阅 dstat 输出http://pastebin.com/fbaccb10)时,性能也大大提高。