Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1151736362
Константинов
2006-07-01 10:46
2006.07.30
Несколько вопросов про Крым


2-1152674594
learner
2006-07-12 07:23
2006.07.30
Combining signed and unsigned types


4-1144920685
oleg_
2006-04-13 13:31
2006.07.30
Выбор директории с указанием текущей


3-1148903751
ttt_111
2006-05-29 15:55
2006.07.30
Работа с DBGrid.


2-1152527956
Postalll
2006-07-10 14:39
2006.07.30
Delphi & ADO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский