(база данных: Oracle 10G R2)
Вставка 100 000 записей в таблицу занимает 1 минуту. Но если таблица уже содержит несколько записей (400 КБ), то это занимает 4 минуты и 12 секунд; также увеличивается ожидание CPU, и «ожидания свободного буфера» становятся действительно высокими (из dbconsole).
Вы знаете, что здесь происходит? Это из-за частых экстентов таблицы? Размер экстента для этих таблиц составляет 1 048 576 байт. У меня ощущение, что БД пытается расширить таблицу хранения.
Я действительно смущен этим. Так что любая помощь будет отличной!
Это оператор вставки:
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) для:
- Пустые таблицы вставок: http://pastebin.com/f40f50dbb
- Таблица с 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 (на это ушло 47 секунд без ожидания процессора - см. Вывод dstat http://pastebin.com/fbaccb10).