Форум: "Базы";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
ВнизОчень медненный 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c