Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Долго выполняется Post


Автор: Akella 16.5.2006, 08:08
FB 2.0+FibPlus641+DevExpress, BDS2006.
Долго (5-10 сек) выполняется DataBase.Post. В чём может быть проблема? Какими путями её возможно решить.
Master-Detail, выполняю Post в мастер-таблицу, детальную даже не трогаю.
В мастер-таблице 5000 записей. В детальной 4000.


Код вроде самый обычный

Код

  fmNewArrival := TfmNewArrival.Create(self);

  fmNewArrival.dblSuppliers.Properties.ListSource.DataSet.Open;
  fmNewArrival.dblSuppliers.Properties.ListSource.DataSet.Locate('ID',dbgArrivalDBTableView1.DataController.DataSet.FieldByName('supplier_id').AsInteger,[]);
  fmNewArrival.cxDateEdit1.Date   := dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('Date_Input').AsDateTime;
  fmNewArrival.edInvoice_num.Text := dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('invoice_num').AsString;
  fmNewArrival.ceCoeff.Value      := dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('coeff').AsFloat;

  if fmNewArrival.ShowModal = mrOk then
      begin
        dbgArrivalDBTableView1.DataController.DataSource.DataSet.Edit;

        dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('invoice_num').AsVariant :=
          fmNewArrival.edInvoice_num.Text;

        dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('date_input').AsVariant :=
          fmNewArrival.cxDateEdit1.Date;

        dbgArrivalDBTableView1.DataController.DataSource.DataSet.FieldByName('coeff').AsVariant :=
          fmNewArrival.ceCoeff.Value;

        dbgArrivalDBTableView1.DataController.DataSource.DataSet.post;

        if (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.State = dsEdit) OR
           (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.State = dsInsert)
        then
          fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.post;

        (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet as TpFIBDataSet).UpdateTransaction.Commit;
//        (dbgArrivalDBTableView1.DataController.DataSource.DataSet as TpFIBDataSet).Refresh;

      end
  else
      begin
        if (dbgArrivalDBTableView1.DataController.DataSource.DataSet.State = dsEdit) OR
           (dbgArrivalDBTableView1.DataController.DataSource.DataSet.State = dsInsert)
        then
          dbgArrivalDBTableView1.DataController.DataSource.DataSet.Cancel;

        if (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet as TpFIBDataSet).UpdateTransaction.InTransaction then
          (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet as TpFIBDataSet).UpdateTransaction.Rollback;

      end;

   freeAndNil(fmNewArrival);



SQL-запрос мастер таблицы
Код

выборка
SELECT
    ID,
    SUPPLIER_ID,
    INVOICE_NUM,
    DATE_INPUT,
    COEFF,
    SUMM_WO_NDS,
    SUMM_RETAIL
FROM
    ARRIVAL 

-----------------------
обновление
UPDATE ARRIVAL
SET 
    SUPPLIER_ID = :SUPPLIER_ID,
    INVOICE_NUM = :INVOICE_NUM,
    DATE_INPUT = :DATE_INPUT,
    COEFF = :COEFF
WHERE
    ID = :OLD_ID
  

Автор: Akella 16.5.2006, 13:49
индекс только один, по ключевому полю 

Автор: SergeBS 17.5.2006, 08:39
Akella
Ну куча вопросов у меня:
Сервер - какая ОС? И диск какой - IDE<>SCSI? Свободное место на диске?
БД - не *.gdb случайно? 
Антивирус стоит?
Эта проблема резко появилась?(в смысле до того было нормально и вдруг БАХ - только на этом месте)
 

Автор: Akella 17.5.2006, 09:25
WinXP sp2
SATAII
Свободного места хватает
БД - fdb
Нод32
Почему-то IBExpert нормально, достаточно быстро сохраняет/добавляет запись. 

Автор: Мишка 17.5.2006, 14:51
Серега, глянь, а в 28 строку не заходит случайно? 

Автор: Akella 17.5.2006, 14:58
нет, не заходит, если ты имеешь ввиду это:
Код

if (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.State = dsEdit) OR
           (fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.State = dsInsert)
        then
28->       fmNewArrival.dbgArrivalDetDBTableView1.DataController.DataSource.DataSet.post;

fmNewArrival.dbgArrivalDetDBTableView1 - это детальная таблица, я её не редактирую, но по задумке она редактироваться тоже должна. 

Автор: Akella 17.5.2006, 15:45
странно

TpFIBDataSet за менил на TpFIBDataSet, с темиже свойсвами, нормально стало работать 

Автор: SergeBS 18.5.2006, 07:20
Akella
Цитата

TpFIBDataSet за менил на TpFIBDataSet, с темиже свойсвами, нормально стало работать  

Т.е. просто удалил, а затем по новой создал и заработало? Чудно. 
Хотя у меня был аналогичный фокус: играя настройками TADODataSet я менял время выполнения от 0.5 сек. до >10 сек. Причем откат обратно в 0.5 был нудным делом - когда много чего накрутишь, потом трудно вспомнить, где что было изначально.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)