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

Вниз

Очень медненный Append в таблицу Firebird-a   Найти похожие ветки 

 
DelphiN! ©   (2006-05-29 09:49) [0]

Когда в таблице было мало записей добавление в базу происходило моментально, теперь чтобы добавить одну звпись в базу необходимо более 2х секунд времени!

Таблица следующая :


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,
   ID_      INTEGER NOT NULL
);


Поле ID_ - уникальное индексное поле, по полю TIME_ также создан индекс

Добавляю данные следующим образом


   CASEBASE.Append;
   CASEBASE.FieldByName("COMP_").AsString := IpToName(IP);
   CASEBASE.FieldByName("SUMM_").AsFloat := RoundTo(Summ, -2);
   CASEBASE.FieldByName("Prim_").AsString := prim;
   CASEBASE.FieldByName("TimeS_").AsDateTime := TimeS;
   CASEBASE.FieldByName("TimePo_").AsDateTime := TimePo;
   CASEBASE.FieldByName("Period_").AsInteger := GetCurrentPeriod;
   CASEBASE.FieldByName("TIME_").AsDateTime := now;
   CASEBASE.FieldByName("User_").AsString := UserName;
   CASEBASE.FieldByName("Usluga_").AsString := Usluga;
   CASEBASE.Post;
   IbTransaction.CommitRetaining;


как уменьшить время добавления записи в таблицу?


 
DelphiN! ©   (2006-05-29 09:52) [1]

Backup\Restore не помогают


 
Sergey13 ©   (2006-05-29 09:56) [2]

Что такое CASEBASE?
Какие-нибудь тригеры висят на таблице? Обработчики на датасете?


 
Сергей М. ©   (2006-05-29 10:01) [3]

Append по идее "тормозить" не может - скорее уж Post и/или CommitRetaining
Для начала замени Append на Insert (хотя это и не принципиально).

Какие индексы существуют в таблице  CASEBASE ?


 
DelphiN! ©   (2006-05-29 10:04) [4]

Sergey13 ©   (29.05.06 09:56) [2]

CASEBASE это имя таблицы.
Стоит тригер на BeforeInsert на поле ID_, который добавляет в него уникальный номер.

Из обработчиков в Датасете стоит только в AfterPost IbTransaction.CommitRetaining;


 
DelphiN! ©   (2006-05-29 10:08) [5]

Сергей М. ©   (29.05.06 10:01) [3]

Ну это то понятно что CommitRetaining тормозит, только ведь он Append выполняет, а из индексов по полю ID_ первичный уникальный ключ создан и поле TIME_ индексное.

Размер таблицы CASEBASE около 100 000 записей, всего в базе данных около 1 000 000 записей, занимает БД около 500 мб.


 
Sergey13 ©   (2006-05-29 10:12) [6]

2Sergey13 ©   (29.05.06 09:56) [2]

>CASEBASE это имя таблицы.

Это я догадался. 8-) Я имел в виду в программе это TTable или TIBDataset? Нет ли переоткрытия после Поста?


 
DelphiN! ©   (2006-05-29 10:14) [7]

Sergey13 ©   (29.05.06 10:12) [6]

TIbDataSet. Переоткрытия нет, так как CommitRetaining сам переоткрывает


 
Sergey13 ©   (2006-05-29 10:17) [8]

2 [7] DelphiN! ©   (29.05.06 10:14)
>TIbDataSet.
И что в нем в проперти SQL?

>Переоткрытия нет, так как CommitRetaining сам переоткрывает
Это как?


 
Сергей М. ©   (2006-05-29 10:18) [9]


> DelphiN! ©   (29.05.06 10:14) [7]


А зачем аж целых два коммита ?
Первый - сразу после после вызова тобой Post, второй - в обработчике AfterPost()

?


 
DelphiN! ©   (2006-05-29 10:19) [10]

Если вместо CommitRetaining использовать просто Commit, то время добавления записи практически не уменьшается ..


 
DelphiN! ©   (2006-05-29 10:21) [11]

Сергей М. ©   (29.05.06 10:18) [9]

Нет, Commit один вызывается(в AfterPost), это я его на форуе вставил просто, чтобы не приводить обработчик AfterPost


 
Сергей М. ©   (2006-05-29 10:22) [12]

Тогда приводи тексты Insert/Select/RefreshSQL ..


 
DelphiN! ©   (2006-05-29 10:28) [13]

Sergey13 ©   (29.05.06 10:17) [8]
2 [7] DelphiN! ©   (29.05.06 10:14)

И что в нем в проперти SQL?


IbDataSet.SelectSQL.Text := "SELECT * FROM CASEBASE WHERE ...";

procedure CASEBASEAfterPost(DataSet: TDataSet);
begin
 IBTransaction1.CommitRetaining;
end;


>Переоткрытия нет, так как CommitRetaining сам переоткрывает
Это как?


Ну ведь когда Commit делаешь, то таблица закрывается, а когда CommitRetaining то просто мерцает, вроде как закрывается и открывается


 
DelphiN! ©   (2006-05-29 10:35) [14]

Сергей М. ©   (29.05.06 10:22) [12]

SELECT * FROM CASEBASE

Select
 COMP_,
 SUMM_,
 TIMES_,
 TIMEPO_,
 PERIOD_,
 USLUGA_,
 TIME_,
 PRIM_,
 USER_
from CASEBASE
where
 ID_ = :ID_

update CASEBASE
set
 COMP_ = :COMP_,
 PERIOD_ = :PERIOD_,
 PRIM_ = :PRIM_,
 SUMM_ = :SUMM_,
 TIME_ = :TIME_,
 TIMEPO_ = :TIMEPO_,
 TIMES_ = :TIMES_,
 USER_ = :USER_,
 USLUGA_ = :USLUGA_
where
 ID_ = :OLD_ID_

insert into CASEBASE
 (COMP_, PERIOD_, PRIM_, SUMM_, TIME_, TIMEPO_, TIMES_, USER_, USLUGA_)
values
 (:COMP_, :PERIOD_, :PRIM_, :SUMM_, :TIME_, :TIMEPO_, :TIMES_, :USER_,
  :USLUGA_)

delete from CASEBASE
where
 ID_ = :OLD_ID_



 
Сергей М. ©   (2006-05-29 11:13) [15]


> когда CommitRetaining то просто мерцает, вроде как закрывается
> и открывается
>


Все-таки ситуация похожа на переоткрытие НД.

CommitRetaining не переоткрывает НД - выполняется подтверждение ТА с сохранением открытого НД.

Посмотри в лог IBSQLMonitor - если переоткрытие НД происходит, это будет отражено в логе.


 
Romkin ©   (2006-05-29 13:17) [16]

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


 
Desdechado ©   (2006-05-29 13:28) [17]

Romkin ©   (29.05.06 13:17) [16]
Также есть подозрения, что при этом все записи отображаются где-нибудь в гриде...

Кстати, один коммит не 100-1000 записей гораздо производительнее, чем по коммиту на запись.

А еще я бы вынес из цикла вызовы функций, например, IpToName(IP), RoundTo(Summ, -2), GetCurrentPeriod


 
Desdechado ©   (2006-05-29 13:29) [18]

да, и обращение к параметрам пономеру быстрее, чем по имени



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
3-1147361563
Neo Trinitron
2006-05-11 19:32
2006.07.30
TOracleDataset,RefreshRecord глюк.


15-1151413524
NORDmen
2006-06-27 17:05
2006.07.30
перевод слов/предложений с помошью программ-переводчиков


2-1152164844
Wood
2006-07-06 09:47
2006.07.30
Как защитить лист или книгу Excel из Delphi?


2-1152693220
Neket
2006-07-12 12:33
2006.07.30
TreeView1


6-1142589590
Volf_555
2006-03-17 12:59
2006.07.30
Как перехватить сообщение ICQ (QIP) и ответить на него?