Код: Выделить всё
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 тормозит, чтобы, возможно, что-то донастроить или обойти эту проблему? Есть ли какие-нибудь возможности это сделать не имея исходного кода?