2

(数据库: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)为:

  1. 空表插入: http: //pastebin.com/f40f50dbb
  2. 包含 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)时,性能也大大提高。

4

7 回答 7

5

不确定这在 Oracle 中是否相同,但在 SQL Server 中,我首先要检查的是表上有多少索引。如果它很多,那么数据库必须在插入记录时做很多工作来重新索引表。重新索引 500k 行比重新索引 100k 行更困难。

于 2009-02-26T04:02:49.020 回答
1

索引是某种形式的树,这意味着插入记录的时间将是 O(log n),其中 n 是树的大小(≈标准唯一索引的行数)。

正如您已经发现的那样,插入它们的最快方法是在插入期间删除/禁用索引并在之后重新创建它。

于 2009-02-26T05:40:12.390 回答
1

即使有索引,插入 100,000 条记录的 4 分钟对我来说似乎也是个问题。

如果这个数据库有 I/O 问题,你还没有修复它们,它们会再次出现。我建议您找出根本原因。

如果您发布索引 DDL,我会安排时间进行比较。


我在 id 和 business_name 上添加了索引。在一个循环中进行 10 次迭代,每 100,000 行的平均时间为 25 秒。这是在我的家用 PC/服务器上,都在一个磁盘上运行。

于 2009-02-26T12:21:43.873 回答
1

另一个提高性能的技巧是在序列(customer_seq)上打开或设置更高的缓存。这将允许 oracle 将序列分配到内存中,而不是为每个插入命中对象。

不过要小心这个。在某些情况下,这将导致您的序列在值之间存在间隙。

此处的更多信息: Oracle/PLSQL:序列(自动编号)

于 2009-03-01T19:25:10.227 回答
0

表中的条目越多,排序插入的时间就越长。

于 2009-02-26T04:01:47.600 回答
0

你不说哪些列被索引。如果您在传真、电话或电子邮件上有索引,那么您将有很多重复项(即每一行)。Oracle '假装' 有非唯一索引。实际上,每个索引条目都是唯一的,实际表行的 rowid 是决定因素。rowid 由文件/块/记录组成。

有可能,一旦您达到一定数量的记录,新的记录就会获得 rowid,这意味着必须将其放入现有索引的中间,并进行大量的索引重写。

如果您提供完整的表和索引创建语句,其他人将能够重现经验,这将允许更多基于证据的响应。

于 2009-02-28T04:10:53.087 回答
-1

我认为这与扩展文件的内部结构以及为添加的信息建立数据库索引有关 - 我相信数据库以非线性方式排列数据,这有助于加快对选择的数据检索

于 2009-02-26T04:01:53.280 回答