Странное зависание TPgQuery при выполнении запроса

Обсуждение возникших проблем, предложений и ошибок PgDAC компонентов
Ответить
danblack
Сообщения: 2
Зарегистрирован: Вт 23 июл 2013 04:39

Странное зависание TPgQuery при выполнении запроса

Сообщение danblack » Вт 23 июл 2013 04:57

Есть код

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, PgAccess, Winapi.Windows;

var
  Query: TPgQuery;
  Connection: TPgConnection;
  Start: Cardinal;
  Finish: Cardinal;
  Caption: string;
begin
  try
    Connection := TPgConnection.Create(nil);
    Connection.Server := '10.10.1.10';
    Connection.Database := 'main';
    Connection.Username := 'denis';
    Connection.Options.UseUnicode := True;
    Query := TPgQuery.Create(nil);
    Query.Connection := Connection;
    Query.Options.UnpreparedExecute := True;
    Query.SQL.Text := 'SET client_min_messages = FATAL;';
    Query.ExecSQL;
    Query.SQL.Text := 'Длинный запрос';
    Start := GetTickCount;
    Query.ExecSQL;
    Finish := GetTickCount;
    Caption := IntToStr(Finish - Start);
    MessageBox(0, PWideChar(Caption), '', MB_OK); // duration: 6500 ms
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
В нем выполняется большой запрос к базе данных, в котором используются хранимые процедуры.
Хранимые процедуры генерируют логирующую информацию через
RAISE LOG 'something';
Время выполнение запроса, судя по логам базы данных ~2000 мс.
Выполнение строки Query.ExecSQL; в коде занимает 6-7 секунд.
Непонятно, на что тратится столько времени.
Если убрать логирование в хранимых процедурах, то строка Query.ExecSQL; выполняется без тормозов.
Использую триальный PgDAC, так что сам код посмотреть не могу. Отладка (свойство Debug), на сколько я понял, в триальной версии тоже недоступна.
Пробовал сэмулировать ситуацию на простых процедурах/данных - не получилось. Поэтому приходится ограничиваться только словесным описанием проблемы.

Как мне понять, где PgQuery тормозит, чтобы, возможно, что-то донастроить или обойти эту проблему? Есть ли какие-нибудь возможности это сделать не имея исходного кода?

DemetrionQ
Devart Team
Сообщения: 51
Зарегистрирован: Пн 28 янв 2013 11:54

Re: Странное зависание TPgQuery при выполнении запроса

Сообщение DemetrionQ » Ср 24 июл 2013 09:39

Здравствуйте.

1) Отладка работает в триальной версии. Что бы её использовать, вам необходимо установить свойство TPgQuery.Debug в True и добавить юнит PgDacVcl в uses раздел в любом юните вашего проекта ( детальную информацию о свойстве TPgQuery.Debug вы найдёте здесь http://www.devart.com/pgdac/docs/devart ... _debug.htm ).

2) Метода TPgQuery.ExecSQL отправляет запрос на сервер и ожидает, пока сервер его не выполнит и не вернёт данные. Суммарное время выполнения запроса складывается из времени выполнения запроса сервером и времени передачи данных между сервером и клиентом.
Попробуйте выполнить ваш SQL запрос с помощью PgAdmin и сравнить время выполнения. Если PgAdmin выполняет запрос быстрее чем PgDAC, предоставьте следующую информацию:
- версия сервера;
- текст вашего запроса;
- скрипты создания процедур и таблиц, которые участвуют в запросе.
Если SQL скрипты слишком большие, вы можете прислать мне их на почту - dmitryk*devart*com

Ответить