Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Velocidad Firedac (https://www.clubdelphi.com/foros/showthread.php?t=97673)

aposi 09-09-2025 12:54:00

Velocidad Firedac
 
Hola,
Tenemos un programa que hasta ahora utilizamos BDE y estamos mirando de migrar a FireDAC
Nos encontramos que las consultas a base de datos es mucho mas lentas.
que creado un programa de test con componentes Firedac y Interbase y la velocidad es muy diferente.


que creado dos conexiones, una con firedac y una con IBdatabase, un query para cada uno y un grid para cada consulta


en Firedac tarda 2351 ms
en IB tarda 182ms


Hay algun parametro para mejorar la velocidad?

Código Delphi [-]
type
  TForm7 = class(TForm)
    FDConnection1: TFDConnection;
    FDQuery1: TFDQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    LabeledEdit1: TLabeledEdit;
    IBDatabase1: TIBDatabase;
    IBQuery1: TIBQuery;
    DataSource3: TDataSource;
    DBGrid3: TDBGrid;
    Button3: TButton;
    LabeledEdit3: TLabeledEdit;
    procedure Button1Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
var
  tInicio, tFin: TDateTime;
  ms: Int64;
begin
  FDQuery1.close;
  tInicio := Now;
  FDQuery1.Open();
  tFin := Now;
  ms := MilliSecondsBetween(tFin, tInicio);
  LabeledEdit1.Text := ms.ToString;
end;



procedure TForm7.Button3Click(Sender: TObject);
var
  tInicio, tFin: TDateTime;
  ms: Int64;
begin
  IBquery1.Close;
  tInicio := Now;
  IBquery1.Open();
  tFin := Now;
  ms := MilliSecondsBetween(tFin, tInicio);
  LabeledEdit3.Text := ms.ToString;
end;

end.

Neftali [Germán.Estévez] 09-09-2025 13:29:20

Muy raro porque la velocidad de ejecución debería ser justo al contrario.
La más lenta el BDE, luego IBExpress y lo más rápidos FireDAC.

En todo caso, habría que hacer una prueba con Interbase (para probar temas de compatibilidad).
Y revisar los temas de configuración.

marco3k 09-09-2025 15:07:25

Habrá que ver como esta estructurado tu consulta y si las tablas tienen los indices necesarios. En bde trabaja con tablas planas y muchas veces se usa el objeto Table trayendo todos los registro, en modo local quizás no se note la diferencia pero en gestores de base de datos como Firebird y demás, no se procede de esa manera (traer todos los registros y luego buscar el que necesites), se debe buscar por un filtro(este filtro debe tener un indice de búsqueda) en la consulta SQL y traer el registro que necesitas.

aposi 09-09-2025 15:54:32

la consulta el es un simple :
Código SQL [-]
Select * from cliente


En la tabla hay 600 clientes

Casimiro Noteví 09-09-2025 16:20:40

Si vas a trabajar con firebird entonces IBX, es lo más rápido y totalmente enfocado a interbase/firebird.
Si vas a usar distintas entonces FireDac.

aposi 09-09-2025 18:13:03

Cita:

Empezado por Casimiro Notevi (Mensaje 567562)
Si vas a trabajar con firebird entonces IBX, es lo más rápido y totalmente enfocado a interbase/firebird.
Si vas a usar distintas entonces FireDac.



la intencion es trabajar con distintas bases de datos, pero el problema es la velocidada en Firedac

Casimiro Noteví 09-09-2025 22:31:22

No creo que sea un problema eso.

Neftali [Germán.Estévez] 10-09-2025 08:50:35

Cita:

Empezado por aposi (Mensaje 567564)
la intencion es trabajar con distintas bases de datos, pero el problema es la velocidada en Firedac

Por lo que yo se, tanto IBExpress como FireDAC acaban conectándose a las Bases de Datos (IB/FB) utilizando la misma librería cliente (gds32.dll, fbclient.dll).
No se cual estás utilizando tú.

Por eso es extraño que exista mucha diferencia de velocidad.
Tal vez deberías revisar la configuración de FireDAC. Importante los Tipos de cursores que estás utilizando (cliente/servidor).

navbuoy 12-09-2025 12:49:13

No te recomiendo cargar un TTable en la app, si tiene demasiados datos sobrecargara el sistema, yo cuando trabajo con cosas asi lo que hago es un TQuery y ejecuto la consulta SQL que trae solo los resultados del Engine de BD, ademas yo utilizo MyDAC MySQL componentes que van bastante rapido

aposi 15-09-2025 17:17:49

Hola,
investigando he visto que són los campos BLOB los que hacen relentizar la consulta...
Otra cosa muy curiosa es que si el programa lo ejecuto en el servidor donde esta la base de datos, el tiempo de respuesta entre Firedac y los componentes Interbase son iguales (con los campos BLOB incluidos en la consulta) , pero si ejecuto la consulta desde otro pc de la red es cuando se demora

marco3k 15-09-2025 18:34:30

Cita:

investigando he visto que són los campos BLOB los que hacen relentizar la consulta...
Claro, cuando de trata en red se debe evitar este tipo de consultas "Select * from cliente" (salvo excepciones), como pusiste en tu consulta inicial, se debe colocar los campos que necesitas, por ejemplo "select nro_doc, nombre, apellido, razon_social, direccion from cliente", de esta manera es mas eficiente. Y como aclaraste que tienes un campo blob ese es un campo innecesario para un listado ABM, porque por ejemplo podrías tener en el campo blob la foto para imprimir una credencial y eso lo podrías consultar individualmente y no traer todas las fotos a la vez.

Cita:

Otra cosa muy curiosa es que si el programa lo ejecuto en el servidor donde esta la base de datos, el tiempo de respuesta entre Firedac y los componentes Interbase son iguales (con los campos BLOB incluidos en la consulta) , pero si ejecuto la consulta desde otro pc de la red es cuando se demora
En el servidor siempre se ejecutara mas rápido porque los datos están localmente, al ejecutarlo en red si el campo blob tiene datos se ejecutara lento la consulta, por eso la necesidad de traer los campos necesarios.

Por eso se debe especificar bien los datos de tu pregunta inicial. Si mencionabas inicialmente que tenias campos blob, tu duda ya se habría resuelto antes.


La franja horaria es GMT +2. Ahora son las 14:04:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi