Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Очень долгий 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.042 c
2-1184160268
vitv
2007-07-11 17:24
2007.08.12
Сброс модема


2-1184649833
Kolan
2007-07-17 09:23
2007.08.12
Записи в DBGrid e странным образом исчезают.


2-1184505453
Gringoire
2007-07-15 17:17
2007.08.12
Работа с сетью Internet


2-1184556371
Cj
2007-07-16 07:26
2007.08.12
HKLM->SYSTEM CurrentControlSet003


2-1184446744
Anar
2007-07-15 00:59
2007.08.12
Не могу преоброзовать строку в дату.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский