Код: Выделить всё
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);
Код: Выделить всё
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
Код: Выделить всё
insert into t1 (id, f1, f2, f3, f4, f5)
select id, f1, f2, f3, f4, f5 from t2
Видно, что после 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, все параметры по умолчанию.