Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-03-2015
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Consultas concatenadas

Hola de nuevo amigos,

En relación a otro post que me habíais contestado relacionado con acciones en una base de datos remota y que, sobre otras bases de datos como mysql, que los clientes no tienen problema a conectar y acceder a los datos con conexiones paupérrimas, vengo de nuevo a preguntar si me lo permitis.

Hemos quedado que no es conveniente hacer
Código Delphi [-]
Select * from tabla
porque esto nos hace que descargue al cliente todos los datos de la tabla sin ser necesarios únicamente los que vamos a usar, pues bien, desgraciadamente no encuentro otra solución puesto que tengo que usar datos de varias tablas y visualizarlos .

He probado a hacer

Código SQL [-]
SELECT r.* ,f.* FROM TCHEQUES r, tbeneficiario f  where EXTRACT(MONTH FROM r.cfecha)=02 and EXTRACT(YEAR FROM r.cfecha)=2015  and r.ccuenta=1 and r.CBENE=f.CLAVEB'
Combinando dos tablas, tcheques y tbeneficiario.

Cosa que en flamerobin me funciona bastante bien, tardando unos 35 segundos en "traer" 26 registros combinados (nose si es una velocidad aceptable), me visualiza el nombre del beneficiario en vez del codigo de beneficiario almacenado en la tabla tcheques.

El problema ocurre en lazarus para windows con componentes zeos, ahi tengo que hacer primero
Código SQL [-]
select * from tbeneficiario where claveb=0
porque de otra forma me da error en otros accesos iniciales y ademas el nombre no me lo visualiza, aparece en blanco. Si llegara a poner
Código SQL [-]
select * from tbeneficiario
en la carga inicial de las tablas, ya no tengo problema.
De todas formas, el campo nombre que visualizo en un campo blob (memo) que no he tenido problema anteriormente porque lo convierto

Código Delphi [-]
procedure Tmodulodatos.ZchequesCalcFields(DataSet: TDataSet);
 VAR
   S:STRING;
 begin
   S := DataSet.FieldByName('NOMBRE').AsString;
   if Length(S) > 100 then
     S := Copy(S, 1, 100) + '[...]';
   DataSet.FieldByName('muestrabene').AsString := S; 
end;

Asi que no se como se pueden optimizar las consultas sin tener que hacer verdaderas barbaridades.

Perdonad el "plastazo"
Responder Con Cita
  #2  
Antiguo 05-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola anubis.

Prueba si el tiempo de respuesta mejora de este modo:
Código SQL [-]
SELECT R.*, F.*
FROM TCHEQUES R INNER JOIN TBENEFICIARIO F ON R.CBENE = F.CLAVEB
WHERE R.CCUENTA = 1
  AND EXTRACT(MONTH FROM R.CFECHA) = 02
  AND EXTRACT(YEAR FROM R.CFECHA)  = 2015

Cita:
Empezado por anubis Ver Mensaje
...
El problema ocurre en lazarus para windows con componentes zeos, ahi tengo que hacer primero

Código SQL [-]
select * from tbeneficiario where claveb=0

porque de otra forma me da error en otros accesos iniciales y ademas el nombre no me lo visualiza, aparece en blanco. Si llegara a poner

Código SQL [-]
select * from tbeneficiario

en la carga inicial de las tablas, ya no tengo problema.
...
No he usado Lazarus / Zeos, pero tal vez te pueda servir de guía como implementarlo en un TSQLQuery:
Código Delphi [-]
...
begin
  with SQLQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT R.*, F.*');
    SQL.Add('FROM VENTAS R INNER JOIN PRODUCTOS F ON R.PRODUCTO_ID = F.ID');
    SQL.Add('WHERE R.CANTIDAD = :PCTA');
    SQL.Add('AND EXTRACT(MONTH FROM R.FECHA) = :PMES');
    SQL.Add('AND EXTRACT(YEAR FROM R.FECHA) = :PANIO');
    Params.ParamByName('PCTA').AsInteger:= 1;
    Params.ParamByName('PMES').AsInteger:= 3;
    Params.ParamByName('PANIO').AsInteger:= 2015;
    Open;
  end;    
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 07-03-2015
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias. Efectivamente algo mejora.
Responder Con Cita
  #4  
Antiguo 07-03-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.408
Poder: 22
fjcg02 Va camino a la fama
Hola,
si te basas en la consulta

Código SQL [-]
SELECT R.*, F.*
FROM TCHEQUES R
INNER JOIN TBENEFICIARIO F ON R.CBENE = F.CLAVEB
WHERE R.CCUENTA = 1
  AND EXTRACT(MONTH FROM R.CFECHA) = 02
  AND EXTRACT(YEAR FROM R.CFECHA)  = 2015
yo creo que si tienes un indice por el campo CFECHA, la consulta podría mejorar si haces

Código SQL [-]
SELECT R.*, F.*
FROM TCHEQUES R 
INNER JOIN TBENEFICIARIO F ON R.CBENE = F.CLAVEB
WHERE R.CCUENTA = 1
  AND R.CFECHA >= '01/02/2015' and R.CFECHA < '01/03/2015'
que es parecido, pero no es igual.
Aunque habría que estar pendiente si el plan de ejecución utiliza el indice R.CFECHA también en el primer caso; si es así, el rendimiento sería similar.

También habría que ver si el indice CCUENTA + CFECHA afecta al rendimiento. Si siempre se utiliza esta combinación para acceder a los datos, sería buen candidato.

Hacer estas pruebas en bien fácil. Se mide el rendimiento antes de tener los índices y después. Se observan los resultados y se sacan las conclusiones.

También hay que confirmar que en la tabla BENEFICIARIO tiene un índice por el campo CLAVEB.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Eficiencia de consultas paramétricas vs consultas estáticas movorack Conexión con bases de datos 9 15-07-2014 15:49:34
Dos consultas en una pablonill Conexión con bases de datos 0 27-09-2008 04:41:09
Consultas SQL V.S. Consultas Clipper AGAG4 SQL 7 20-12-2005 16:59:31
Consultas silviodp Conexión con bases de datos 6 06-08-2004 00:44:24
Consultas NickName Firebird e Interbase 1 27-11-2003 06:37:27


La franja horaria es GMT +2. Ahora son las 17:15:25.


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