Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2018, 19:20   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Проверить длительность/скорость операции с запросом к БД

Доброе время суток,
Такая проблема:
По нажатию кнопки, становится видимым DBGrid и просходит выполнения запроса.
У меня появилось впечатление, что при разных случаях нажатия кнопки, один и тот же процесс происходит с затратой разного количества времени.
Для измерения времени я использовал TTimer (начальные значения: Enabled = false, Interval = 1)

Код:
Var
pr_int: integer;

procedure TFMain.Button4Click(Sender: TObject);
begin
pr_int := 0;
timer1.Enabled := true;

dbgrehPlan.Visible := true;
ExecQuery(Format(C_sel_registr, [rgrShowTypeRecords.ItemIndex]), 1, Select_rec, ibdsContract);

timer1.Enabled := false;
showmessage(inttostr(pr_int));
end;

procedure TFMain.Timer1Timer(Sender: TObject);
begin
   inc(pr_int);
end;

procedure ExecQuery(ARequire: string;
                    ASuiteData: integer;
                    A_ActQuery: ActRecord;
                    ADataSet: TIBDataSet);
//процедура выполняющая запрос
var
  LID: integer;
begin
  case ASuiteData of
    0:
      begin
        FMain.ibqEmpty.Close;
        FMain.ibqEmpty.SQL.Clear;
        FMain.ibqEmpty.SQL.Add(ARequire);
//showmessage(ibqEmpty.SQL.CommaText);
        if A_ActQuery = Select_rec then
        begin
          FMain.ibqEmpty.Open;
          FMain.ibqEmpty.FetchAll;
          FMain.ibqEmpty.First;
        end
        else
        begin
          FMain.ibqEmpty.ExecSQL;
          FMain.ibtrPlan.CommitRetaining;
        end;
      end;
    1:
      begin
        if ADataSet.FindField('ID') <> nil then
          if A_ActQuery = Exec_rec then
          begin
            ADataSet.DisableControls;
            ADataSet.Next;
            LID := ADataSet.FieldByName('ID').AsInteger;
            ADataSet.Prior;
            ADataSet.EnableControls;
          end
          else LID := ADataSet.FieldByName('ID').AsInteger;

        ADataSet.Close;
        ADataSet.SelectSQL.Clear;
        ADataSet.SelectSQL.Add(ARequire);
//showmessage(ADataSet.SelectSQL.CommaText);
        ADataSet.DisableControls;
        ADataSet.Open;
        ADataSet.FetchAll;
        case A_ActQuery of //position on record
          Select_rec: ADataSet.First;
          Exec_rec:
                   begin
                     if LID = 0 then //insert new word
                       ADataSet.Last
                     else ADataSet.Locate('ID', LID, []);
                   end;
        end;
        ADataSet.EnableControls;
      end
  end;
end;
К моему сожалению, таймер выдал «0» во всех случаях.
Может я что не так сделал, хотя в одном из случаев, отображение данных в dbgrid на глаз происходит за 2сек.

Спасибо за ответ.

Последний раз редактировалось KBO; 23.04.2018 в 19:23.
KBO вне форума Ответить с цитированием
Старый 23.04.2018, 19:23   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

разница между GetTickCount до и после и никакого таймера
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.04.2018, 19:47   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
GetTickCount
function GetTickCount: Longint;
Считывает вpемя, пpошедшее с момента запуска системы.

Типа так,
Код:
procedure TFMain.Button4Click(Sender: TObject);
var
  starttime,endtime,q: int64;
begin

starttime:=GetTickCount;

dbgrehPlan.Visible := true;
ExecQuery(Format(C_sel_registr, [rgrShowTypeRecords.ItemIndex]), 1, Select_rec, ibdsContract);


endtime:=GetTickCount;
q:=endtime-starttime;
showmessage(inttostr(q));
end;
KBO вне форума Ответить с цитированием
Старый 23.04.2018, 20:18   #4
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

А подскажите пожалуйста,

Вот, выполняю один и тот же код
Код:
procedure TFMain.Button4Click(Sender: TObject);
begin
dbgrehPlan.Visible := true;
ExecQuery(Format(C_sel_registr, [rgrShowTypeRecords.ItemIndex]), 1, Select_rec, ibdsContract);

end;
А время исполнения, первый раз = 83, а последующие = 375 и выше.

Такое офигенное увеличение времени, с чем это может быть связано?

Последний раз редактировалось KBO; 23.04.2018 в 20:21.
KBO вне форума Ответить с цитированием
Старый 23.04.2018, 20:26   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

мало ли почему, вдобавок меряешь не время выполнения sql-процедуры, а целый кусок программного кода, который и выполняется по разному в зависимости от параметров. Да и одна и та же sql-процедуры при многократном обращении разное время выполнения может давать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.04.2018, 20:48   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Все нашел, спасибо.

У меня в таблице есть столбец "user_id", указывающий на "ID" пользователя, который редактировал запись последний раз.
Вот...

В событии "AfterScroll" DataSet, я выводил инициалы пользователя
Код:
ibdsUser.Locate('ID', ADataSetClick.FieldByName('USER_ID').AsString, []);
        sbStatusProg.Panels[1].Text := ibdsUser.FieldByName('FAMILY_NAME').AsString+' '
                                       +(ibdsUser.FieldByName('NAME').AsString)[1]+'. '
                                       +(ibdsUser.FieldByName('PATRONYMIC_NAME').AsString)[1]+'.';
теперь наверно, нужно забить на это... и выводить по щелчку мышки на grid... или еще как...

или просто избавится от "user_id" как ссылки и писать стринговое поле

Последний раз редактировалось KBO; 23.04.2018 в 20:52.
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
длительность сортировки a_clarke Помощь студентам 0 29.11.2015 19:54
какой программой проверить скорость чтения HDD? contin Компьютерное железо 2 18.05.2012 15:46
Длительность (продолжительность) видео-файла и Access Рысь Комнатная Microsoft Office Access 10 30.10.2009 17:15
Как определить длительность ролика flv Yong777 PHP 2 21.04.2009 22:02