Форум: "Базы";
Текущий архив: 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.043 c