Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

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

 
DelphiN! ©   (2007-04-24 15:03) [0]

Если данных в таблице мало, то 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;


 
DelphiN! ©   (2007-04-24 15:05) [1]

тип транзакции в IbTransaction Read committed

Почему Insert проходит так долго? Как ускорить работу?


 
Val ©   (2007-04-24 15:08) [2]

может, долго перечитывается набор после инсерта, а не сам инсерт?


 
Sergey13 ©   (2007-04-24 15:08) [3]

> [0] DelphiN! ©   (24.04.07 15:03)
> Добавление делаю следующим образом :

Тормозит одиночная вставка или фрагмент цикла?

ЗЫ: Не знаю как в ФБ, но в Оракле помнится рекомендовали в таблице все поля типа варчар выносить в конец списка, а ключевые в начало.


 
atruhin ©   (2007-04-24 15:17) [4]

Попробуй выполнить вставку записи запросом insert в IBExpert, сообщи время которое он показывает.
Какие компоненты доступа. Трогал или нет настройки сервера (firebird.conf)?


 
Desdechado ©   (2007-04-24 15:20) [5]

Что-то мне кажется, что под словом Dataset скрывается IBTable.
И коммититься на каждый Post - довольно порочная практика.


 
Val ©   (2007-04-24 15:25) [6]

это может быть пользовательская форма ввода - почему бы тогда и не коммититься на каждый пост?


 
Виталий Панасенко ©   (2007-04-24 15:26) [7]


> Desdechado ©   (24.04.07 15:20) [5]
> Что-то мне кажется, что под словом Dataset скрывается IBTable.
>
> И коммититься на каждый 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_)

Возможно, еще что-то есть в коде.. типа Close/Open


 
Карелин Артем ©   (2007-04-24 15:27) [8]


> Desdechado ©   (24.04.07 15:20) [5]

Читай внимательнее.


> DelphiN! ©   (24.04.07 15:03)  

Попробуй на цикл вставки отключить или грохнуть индексы. И транзакцию подтверждай после цикла самого


 
Val ©   (2007-04-24 15:27) [9]

автор, мы терзаемся догадками и томимся в ожидании, открой тайну


 
Карелин Артем ©   (2007-04-24 15:29) [10]


> DelphiN! ©   (24.04.07 15:03)  

Попробуй Append на Insert заменить.


 
Val ©   (2007-04-24 15:30) [11]

>[8] Карелин Артем ©   (24.04.07 15:27)
кто сказал про цикл?


 
Карелин Артем ©   (2007-04-24 15:32) [12]


> Val ©   (24.04.07 15:30) [11]

Был неправ я!


 
Сергей М. ©   (2007-04-24 15:44) [13]

Сдается мне, дело тут пахнет сборкой мусора, на которую "попал" клиент.

И 500 тыс. записей тут ни при чем.


 
Jan1   (2007-04-24 16:54) [14]

Весь трабл в том что это в одной транзакции, надо разбить на более мелкие скажем по 1000 записей. И тогда летать будет.


 
Val ©   (2007-04-24 16:59) [15]

коллеги, давайте подождем топикстартера. мы буйно фантазируем на околотопиковые темы :)


 
Romkin ©   (2007-04-24 17:20) [16]

ДА что мудрить: перечитывание после каждой вставки всего набора. Append - он в конец добавляет, следовательно, полный фетч. А тут еще и транзакция закрылась :)))
Понятно, тормоза :)


 
Desdechado ©   (2007-04-24 18:02) [17]

Jan1   (24.04.07 16:54) [14]
Какие тысячи? Речь об ОДНОЙ записи. Тем паче коммит сразу же.

Romkin ©   (24.04.07 17:20) [16]
Собственно, подозрением на IBTable я намекал именно на это - переоткрытие и вычитывание всего растущего с каждой записью набора данных.

А автору, похоже, фиолетово.


 
Виталий Панасенко ©   (2007-04-24 18:02) [18]


> Romkin ©   (24.04.07 17:20) [16]
> ДА что мудрить: перечитывание после каждой вставки всего
> набора. Append - он в конец добавляет, следовательно, полный
> фетч. А тут еще и транзакция закрылась :)))
> Понятно, тормоза :)
> <Цитата>

30 сек на 500000... не знаю, что за машины.. у меня на "целке" 2,4/256 на 200000 записях если вниз рулить нааамного дольше.. хотя не известно, как происходит вставка.. если действительно в открытый НД, то память начинает исчезать, своп расти...


 
DelphiN! ©   (2007-04-26 11:52) [19]

Извиняюсь что пропал, темпиратурил день ...

Вот полный код вставки :

DataSet.SelectSQL.Text := "SELECT * FROM CASEBASE";
DataSet.Open;      
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 типа TibDataSet

1а транзакция добавляет 1у запись, никаких циклов добавления записей нет...


 
Sergey13 ©   (2007-04-26 12:00) [20]

> [19] DelphiN! ©   (26.04.07 11:52)
> Append

Попробуй Insetr.


 
Val ©   (2007-04-26 12:41) [21]

и обыкновенный commit.


 
Desdechado ©   (2007-04-26 12:50) [22]

Для чего открывать таблицу, если нужно только добавить строку в нее?
Ты всегда перечитываешь свои конспекты от корки до корки, чтоб дописать пару строчек в конец?

INSERT INTO casebase VALUES( ... )
и все


 
Deniz ©   (2007-04-28 11:40) [23]

А покажи DataSet.SelectSQL.Text


 
Sergey13 ©   (2007-04-28 11:48) [24]

> [23] Deniz ©   (28.04.07 11:40)

А прочитай [19] DelphiN! ©   (26.04.07 11:52)
8-)


 
Deniz ©   (2007-04-28 14:23) [25]

:-)
что-то подслеповат стал


 
Slava ©   (2007-05-02 09:37) [26]


> DelphiN! ©   (26.04.07 11:52) [19]



> DataSet типа TibDataSet


Всё-таки попробуй заменить на TIBQuery + вот это:

> Desdechado ©   (26.04.07 12:50) [22]
>
>
> INSERT INTO casebase VALUES( ... )
> и все


Скорее всего поможет



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.031 c
15-1184678519
Nous Mellon_
2007-07-17 17:21
2007.08.12
Как настроить .htaccess?


11-1167329054
Thaddy
2006-12-28 21:04
2007.08.12
site problems


2-1184582897
Kostafey
2007-07-16 14:48
2007.08.12
Получить список таблиц из Access-файла.


2-1184267004
bagos
2007-07-12 23:03
2007.08.12
Как быть с такмими числами?


15-1184256508
TUser
2007-07-12 20:08
2007.08.12
Таки он есть :)