Наткнулся на странную вещь: при массовой загрузки данных в базу скорость
последовательности инсертов уменьшается на 1/6 если все они в одной
транзакции.
Память сервера тоже растёт, но это как бы ожидаемо...
Я что-то не так делаю?
Платформа: Kubuntu 10.4
Сервер: FirebirdSS-2.5.0.26038-ReleaseCandidate3.i686.tar.gz
Тайминг с 1 коммитом на всё:
11:08:06 start
11:08:11 5000
11:08:18 10000
11:08:26 15000
11:08:36 20000
11:08:47 25000
11:09:00 30000
11:09:16 35000
11:09:33 40000
11:09:53 45000
11:10:15 50000
11:10:39 55000
...
Память сервера доходит до 500мб.
Тайминг с коммитом на каждые 5000 запмсей:
13:07:50 start
13:07:56 5000
13:08:02 10000
13:08:08 15000
13:08:14 20000
13:08:20 25000
13:08:26 30000
13:08:32 35000
13:08:38 40000
13:08:44 45000
13:08:50 50000
13:08:56 55000
...
Память сервера доходит не поднимается выше 20мб.
Клиент - простенький скрипт на python-е делающий 2 параметрических
инсерта в разные таблицы на цикл.
Таблицы:
CREATE TABLE SYMPTOMS (
ID D_ID,
TITLE_EN D_TITLE,
TITLE_RU D_TITLE,
CHAPT_ID D_ID,
PARENT_ID D_ID_OR_NULL,
CATEG_ID D_ID,
DISABLED D_BOOL DEFAULT 0,
COPIED D_BOOL DEFAULT 0,
VERS D_VERS,
CONSTRAINT PK_SYMPTOMS PRIMARY KEY (ID),
CONSTRAINT UNQ_SYMPTOMS_VERS UNIQUE (VERS)
);
ALTER TABLE SYMPTOMS ADD CONSTRAINT FK_SYMPTOMS_CATEG_ID
FOREIGN KEY (CATEG_ID) REFERENCES SYMP_CATEGS (ID);
ALTER TABLE SYMPTOMS ADD CONSTRAINT FK_SYMPTOMS_CHAPT_ID
FOREIGN KEY (CHAPT_ID) REFERENCES CHAPTERS (ID) ON DELETE CASCADE;
ALTER TABLE SYMPTOMS ADD CONSTRAINT FK_SYMPTOMS_PARENT_ID
FOREIGN KEY (PARENT_ID) REFERENCES SYMPTOMS (ID);
CREATE TABLE SYMPTOMS_OLD (
ID D_ID,
OBJ_ID D_ID,
SYS_ID D_ID,
EXT_ID D_NUM,
VERS D_VERS,
CONSTRAINT PK_SYMPTOMS_OLD PRIMARY KEY (ID),
CONSTRAINT UNQ_SYMPTOMS_OLD_OSE UNIQUE (OBJ_ID,SYS_ID,EXT_ID),
CONSTRAINT UNQ_SYMPTOMS_OLD_VERS UNIQUE (VERS)
);
ALTER TABLE SYMPTOMS_OLD ADD CONSTRAINT FK_SYMPTOMS_OLD_OBJ_ID
FOREIGN KEY (OBJ_ID) REFERENCES SYMPTOMS (ID);
ALTER TABLE SYMPTOMS_OLD ADD CONSTRAINT FK_SYMPTOMS_OLD_SYS_ID
FOREIGN KEY (SYS_ID) REFERENCES REP_SYSTEMS (ID);
На обоих таблицах триггера генерят ID и VERS и бросают EVENT:
CREATE TRIGGER (TableName)_GEN_ID ACTIVE
BEFORE INSERT POSITION 0
as
begin
if (new.ID is null) then
new.ID = gen_id(GEN_(TableName)_ID, 1);
end
CREATE TRIGGER (TableName)_SET_VERS ACTIVE
BEFORE INSERT OR UPDATE POSITION 1
as
begin
new.VERS = gen_id(GEN_(TableName)_VERS, 1);
end
CREATE TRIGGER (TableName)_MODIFY ACTIVE
AFTER INSERT OR UPDATE POSITION 0
as
begin
post_event '(TableName)_MODIFY';
end
--
Александр Замараев