![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очень долгий Insert в таблицу БД FireBird 1.5
DelphiN! © (2007-04-24 15:03:00)Если данных в таблице мало, то Insert проходит мгновенно, но когда колличество записей достигло 500 000 Insert стал проходить по 30 секунд
BackUp\Restore проводить пробовал, но результат остался тем-же
Вот структура Таблицы, в которую производится добавление записи
SET NAMES WIN1251;
CREATE DATABASE 'D:\Shared\Projects\xgh II\server\data\BASES\BASE.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1251;
/******************************************************************************/
/*** Generators ***/
/******************************************************************************/
CREATE GENERATOR GEN_CASEBASE_ID;
SET GENERATOR GEN_CASEBASE_ID TO 606967;
/******************************************************************************/
/*** Tables ***/
/******************************************************************************/
CREATE TABLE CASEBASE (
COMP_ VARCHAR(20) CHARACTER SET NONE,
SUMM_ FLOAT,
TIMES_ DATE,
TIMEPO_ DATE,
PERIOD_ INTEGER,
USLUGA_ VARCHAR(20) CHARACTER SET NONE,
TIME_ DATE,
PRIM_ VARCHAR(20) CHARACTER SET NONE,
USER_ VARCHAR(20) CHARACTER SET NONE,
POINT_ VARCHAR(25) CHARACTER SET NONE,
CARDNO_ VARCHAR(25) CHARACTER SET NONE,
ID_ INTEGER NOT NULL
);
/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/
ALTER TABLE CASEBASE ADD PRIMARY KEY (ID_);
/******************************************************************************/
/*** Indices ***/
/******************************************************************************/
CREATE INDEX CASEBASE_IDX1 ON CASEBASE (TIME_);
CREATE INDEX CASEBASE_IDX2 ON CASEBASE (PERIOD_);
/******************************************************************************/
/*** Triggers ***/
/******************************************************************************/
SET TERM ^ ;
/******************************************************************************/
/*** Triggers for tables ***/
/******************************************************************************/
/* Trigger: CASEBASE_BI */
CREATE TRIGGER CASEBASE_BI FOR CASEBASE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_ IS NULL) THEN
NEW.ID_ = GEN_ID(GEN_CASEBASE_ID,1);
END
^
SET TERM ; ^
Добавление делаю следующим образом :
DataSet.Append;
DataSet.FieldByName('COMP_').AsString := IpToName(IP);
DataSet.FieldByName('SUMM_').AsFloat := RoundTo(Summ, -2);
DataSet.FieldByName('Prim_').AsString := prim;
DataSet.FieldByName('TimeS_').AsDateTime := TimeS;
DataSet.FieldByName('TimePo_').AsDateTime := TimePo;
DataSet.FieldByName('Period_').AsInteger := GetCurrentPeriod;
DataSet.FieldByName('TIME_').AsDateTime := now;
DataSet.FieldByName('User_').AsString := UserName;
DataSet.FieldByName('Usluga_').AsString := Usluga;
DataSet.FieldByName('POINT_').AsString := frmSettings.edtOrganization.Text;
DataSet.Post;
DataSet.InsertSQL.Text =
insert into CASEBASE
(COMP_, PERIOD_, PRIM_, SUMM_, TIME_, TIMEPO_, TIMES_, USER_, USLUGA_, POINT_, CARDNO_)
values
(:COMP_, :PERIOD_, :PRIM_, :SUMM_, :TIME_, :TIMEPO_, :TIMES_, :USER_,
:USLUGA_, :POINT_, :CARDNO_)
DataSet OnAfterPost =
procedure AfterPost(DataSet: TDataSet);
begin
IBTransaction1.CommitRetaining;
end;
Val (2007-04-24 15:25:00) [21]это может быть пользовательская форма ввода - почему бы тогда и не коммититься на каждый пост?
Desdechado (2007-04-24 15:20:00) [22]Что-то мне кажется, что под словом Dataset скрывается IBTable.
И коммититься на каждый Post - довольно порочная практика.
atruhin (2007-04-24 15:17:00) [23]Попробуй выполнить вставку записи запросом insert в IBExpert, сообщи время которое он показывает.
Какие компоненты доступа. Трогал или нет настройки сервера (firebird.conf)?
Sergey13 (2007-04-24 15:08:00) [24]> [0] DelphiN! © (24.04.07 15:03)
> Добавление делаю следующим образом :
Тормозит одиночная вставка или фрагмент цикла?
ЗЫ: Не знаю как в ФБ, но в Оракле помнится рекомендовали в таблице все поля типа варчар выносить в конец списка, а ключевые в начало.
Val (2007-04-24 15:08:00) [25]может, долго перечитывается набор после инсерта, а не сам инсерт?
DelphiN! (2007-04-24 15:05:00) [26]тип транзакции в IbTransaction
Read committed
Почему Insert проходит так долго? Как ускорить работу?