PDA

Ver la Versión Completa : Consultas concatenadas


anubis
05-03-2015, 06:35:17
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 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

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 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 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


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"

ecfisa
05-03-2015, 08:03:48
Hola anubis.

Prueba si el tiempo de respuesta mejora de este modo:

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



...
El problema ocurre en lazarus para windows con componentes zeos, ahi tengo que hacer primero

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

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:

...
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 :)

anubis
07-03-2015, 02:47:37
Gracias. Efectivamente algo mejora. :D

fjcg02
07-03-2015, 22:32:08
Hola,
si te basas en la consulta

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

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