Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Очень долгий Insert в таблицу БД FireBird 1.5


Страницы:   1 2

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 проходит так долго? Как ускорить работу?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо