Скорость вставки - академический интерес.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Скорость вставки - академический интерес.

Сообщение entryway » 12 июл 2011, 14:28

Есть две таблицы:

Код: Выделить всё

create table t1 (id integer, f1 integer, f2 integer, f3 integer, f4 integer, f5 integer);

create index t1_idx_f1 on t1 (f1);
create index t1_idx_f2 on t1 (f2);
create index t1_idx_f3 on t1 (f3);
create index t1_idx_f4 on t1 (f4);
create index t1_idx_f5 on t1 (f5);
create index t1_idx_id on t1 (id);

create table t2 (id integer, f1 integer, f2 integer, f3 integer, f4 integer, f5 integer);
Заполняем t2 случайными данными:

Код: Выделить всё

create or alter procedure proc_fill
as
declare variable var_count integer;
begin
  var_count = 0;
  while (var_count < 100000) do
  begin
    insert into t2 (id, f1, f2, f3, f4, f5)
    values (:var_count,
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer)
    );
    var_count = var_count + 1;
  end
end
Выполняем следующий запрос 10 раз подряд с комитом после каждого раза:

Код: Выделить всё

insert into t1 (id, f1, f2, f3, f4, f5)
select id, f1, f2, f3, f4, f5 from t2
Время выполнения в секундах: 9, 10, 10, 11, 19, 10, 10, 12, 126, 342

Видно, что после 800k записей скорость вставки резко падает на порядок. Если изначально залить в t2 1кк записей (вместо 100к) и выполнить этот же запрос, то время его выполнения будет ~13 минут.

Вопрос: почему тормоза начинаются именно на границе 800к-900к записей и сразу в 10-20 раз и возможно ли это исправить подкрутив firebird.conf? Пробовал ставить "TempCacheLimit = 200000000" - ничего не изменилось.

WinXP 32bit, 2GB RAM, Firebird-2.5.0.26074_1_Win32.exe, Super Server, все параметры по умолчанию.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Скорость вставки - академический интерес.

Сообщение Dimitry Sibiryakov » 12 июл 2011, 14:38

Бери в руки:
SET STATS ON;
gstat -a -t T1

И смотри что там растёт. Может, у индексов отрастает следующий уровень, может кэш кончается.

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Re: Скорость вставки - академический интерес.

Сообщение entryway » 12 июл 2011, 15:02

Dimitry Sibiryakov писал(а):gstat -a -t T1
gstat "192.168.0.5:D:\!temp\TEST2.FDB" -u sysdba -p masterkey -a -t T1 >a.txt
http://pastebin.com/MkVJxDb5

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Скорость вставки - академический интерес.

Сообщение dimitr » 12 июл 2011, 17:11

размер страничного кеша увеличивай

entryway
Сообщения: 71
Зарегистрирован: 13 апр 2006, 18:06

Re: Скорость вставки - академический интерес.

Сообщение entryway » 12 июл 2011, 17:30

dimitr писал(а):размер страничного кеша увеличивай
Спасибо, помогло. 1кк записей проинсертилось в таблицу с индексами за 107 секунд вместо 13 минут.

Ответить