Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > La Taberna
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
lentitud en conexion remota con bases de datos

Mi gozo en un pozo!.

Dejadme que me desahogue

Hay elementos que uno no tiene en cuenta a la hora de hacer un programa, en mi caso, y gracias a vosotros aprendo mucho, al final no se si me servirá para algo, pero por lo menos mantengo ocupado en mis ratos libres el cerebro.
Empecé con el sqlite, por ser mas sencillo, a mi parecer, y monopuesto. Muy bien. Un programa que tenia en sqlite lo pase a firebird, y funciona estupendamente en red local, con algún detallito de lentitud.
Y ahora lo estoy probando remotamente via internet, y se tarda mucho en abrir. Si, se que he usado archivos blob y eso alente la conexión también.
Como decía, en estos casos, uno no tiene en cuenta la velocidad de subida de internet en el servidor (que suele ser la que nos dan al contratar el servicio de internet) en mi caso, 768kbits con 12 mbits de bajada.
Pero sí es frustrante tanto trabajo para nada, porque podría haber dejado la base de datos en sqlite y seguir usandola en red local con enlaces.

Hace 15 minutos que he abierto mi programa y todavia esta conectando con la base de datos, asi que ni abre (las conexiones están bien ).

en fin, una disculpa por este post, aunque me ha servido para compartir mi frustración.

saludos
Responder Con Cita
  #2  
Antiguo 24-11-2012
Avatar de Julián
Julián Julián is offline
Merodeador
 
Registrado: may 2003
Ubicación: en mi casa
Posts: 2.019
Poder: 10
Julián Va por buen camino
Lamentarse no te va a solucionar nada. Con esa conexión, si te va lento es por que hay algo mal. Si quieres, abre un hilo, en el foro adecuado, explicando como es tu aplicación, como se conecta, lenguaje que usas, etc, y seguro que te podremos ayudar a identificar el fallo y su solución.

Un saludo.
__________________
"la única iglesia que ilumina es la que arde"
Anonimo
Responder Con Cita
  #3  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Coincido con Julián, una cosa es que en lugar de una décima de segundo, ahora tarde 2 segundos. Pero un cuarto de hora para conectar es que algo está muy mal
Responder Con Cita
  #4  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por darme un poco de esperanza.

Vereis, la conexion la hago a traves de un tunnel ssh.
Con un administrador, como el fdbmaestro, al intentar ver los datos, por ejemplo, de la tabla con los blob, me tarda un par de minutos, con flamerobin, tarda menos, pero con la aplicacion que tengo (que son dos), con una tarda en abrir 15 min y con la otra casi nada.

La conexión es esta:

Código Delphi [-]
zconnection1.Protocol:='firebird-2.5';
 try
 zconnection1.Connected:=true;
 except
 showmessage('conexión imposible. Verifique su conexión');
 end;
zquery3.connection:=zconnection1;
zquery2.Connection:=zconnection1;
zquery1.Connection:=zconnection1;
zquery4.connection:=zconnection1;

zquery2.SQL.text:='select * from tbeneficiario';
zquery3.SQL.Text:='select * from tcuentas';
zquery1.sql.text:='select * from tcheques';
zquery4.sql.text:='select * from facturas';
 zquery3.Active:=true;
 zquery2.Active:=true;
 zquery4.active:=true;
 zquery1.Active:=true;
 datasource1.DataSet:=zquery1;
 datasource2.dataset:=zquery2;
 datasource3.dataset:=zquery3;
 datasource4.dataset:=zquery4;
 dbgrid1.DataSource:=datasource1;
 dblookupcombobox1.ListSource:=datasource3;
 dblookupcombobox1.KeyField:='clave';
 dblookupcombobox1.ListField:='cuenta';

 dblookupcombobox2.ListSource:=datasource2;
 dblookupcombobox2.KeyField:='claveb';
 dblookupcombobox2.ListField:='calculado';
 dblookupcombobox1.itemindex:=0;

 dblookupcombobox2.Enabled:=false;


 FILTRO1:=1;
 FILTRAR;
 FECHAS;
 COMBOBOX1.ItemIndex:=MES-1;
 SPINEDIT1.Value:=ANO;
 checkbox2.Checked:=true;
 cambiar;
 ORDEN:=' ASC';

end;

Código Delphi [-]
procedure tform1.leerconfiguracion;
 var
   archivoini:tinifile;
   basededatos:string;
   servidor:string;
   puerto:string;
begin
archivoini:=tinifile.create(ExtractFilePath( Application.ExeName)+'path.ini');
basededatos:=archivoini.readstring('ruta','path','val');
puerto:=archivoini.readstring('ruta','puerto','val');
servidor:=archivoini.readstring('ruta','server','val');
zconnection1.Database:=basededatos;
zconnection1.HostName:=servidor;
zconnection1.Port:=strtoint(puerto);
 archivoini.Free;
end;

La base de datos tiene 2000 registros, y ocupa 34 mb.

No se que mas datos se necesitan.

Gracias de nuevo de verdad
Responder Con Cita
  #5  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Primera regla: nunca jamás hagas burradas del tipo 'select * from ...'
Código:
zquery2.SQL.text:='select * from tbeneficiario'; 
zquery3.SQL.Text:='select * from tcuentas'; 
zquery1.sql.text:='select * from tcheques'; 
zquery4.sql.text:='select * from facturas';
Responder Con Cita
  #6  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
gracias amigo casimiro.

Si, se que eso recoge todos los registros. Pero eso lo uso cuando quiero ver todos los registros.

Llamame burro o asno, pero siempre habia usado eso asi incluso para consultas.

Código Delphi [-]
procedure TForm1.filtrar;
begin
zquery1.close;
ZQUERY1.sql.clear;
ZQUERY1.SQL.Text:='select sum(cmonto) as suma11 FROM tcheques where ccuenta=:cuenta2';
zquery1.ParamByName('cuenta2').asinteger:=filtro1;
ZQUERY1.active:=true;
LABEL2.CAPTION:=FloatToStrF((zquery1.Fieldbyname('suma11').asfloat),ffcurrency,8,2);
label2.repaint;
ZQUERY1.SQL.Clear;
ZQUERY1.SQL.TEXT:='select * from tcheques where ccuenta=:cuenta2';
zquery1.ParamByName('cuenta2').asinteger:=filtro1;
zquery1.active:=true;
end;

Gracias de verdad.
Responder Con Cita
  #7  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hombre, no te llamo burro a ti, lo que digo es que hacer eso es una barbaridad/burrada.
Y si tienes costumbre de hacerlo, pues es mala costumbre, está claro.
Resumiendo: ¿necesitas traerte todos los campos y todos los registros?
Responder Con Cita
  #8  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
No te preocupes, si son burrada soy burro si no hago las cosas como se deben sino uno no aprende.

De entrada si uso esa sentencia es porque hay que asignarle al query la tabla que vas a usar.
y la otra de consultas es para filtrar segun lo que me conviene y luego se la vuelvo a aplicar con * por si tengo que aplicar otra consulta y no me la aplique solo con los registros resultantes de la consulta anterior.

Si no se debe hacer asi, si me das un ligero apunte a ver si me aclaro, porque no se trata de que las cosas funcionen, sino de que funcionen aplicando las reglas como deben de ser.

gracias de nuevo

Esto no es lo que se pone para asignar al inicio?.

Código Delphi [-]
zquery2.SQL.text:='select * from tbeneficiario';
zquery3.SQL.Text:='select * from tcuentas';
zquery1.sql.text:='select * from tcheques';
zquery4.sql.text:='select * from facturas';
 zquery3.Active:=true;
 zquery2.Active:=true;
 zquery4.active:=true;
 zquery1.Active:=true;
 datasource1.DataSet:=zquery1;
 datasource2.dataset:=zquery2;
 datasource3.dataset:=zquery3;
 datasource4.dataset:=zquery4;

Última edición por anubis fecha: 24-11-2012 a las 18:19:21.
Responder Con Cita
  #9  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
Esto no es lo que se pone para asignar al inicio?.
Bueno, no.
Quiero decir lo que he preguntado antes: ¿necesitas para algo traerte todos los campos de todos los registros de todas esas tablas?
Responder Con Cita
  #10  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
hombre, de primera no, pero cuando ya se abre el programa, se tienen que ver todos los registros del mes, por ejemplo.

si yo le pongo un select * from, me trae todos, pero sino lo pongo asi, como hago una consulta de todos los registros del mes sino le afecta a todos para que haga el filtrado. Si, eso lo debe hacer en el servidor y luego se bajan los del mes que siempre serán menos.

En lineas generales te entiendo lo que dices, y voy cogiendo la idea, el problema es como asigno primero el query sin ponerle el select * from, y la otra es como hago una consulta directamente en el servidor y traerme esos datos.

Porque si estoy viendo que lo hice todo mal .
Edito: En el caso de las consultas en el servidor, puede ser un procedimiento diretamente en la base de datos del servidor? y simplemente llamarlo?.
El caso inicial al iniciar la aplicacion no se me ocurre que poner en el select quue no sea el *

Última edición por anubis fecha: 24-11-2012 a las 19:11:56.
Responder Con Cita
  #11  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que no entiendo bien. Veamos, si quieres/necesitas traerte una serie de campos de una serie de registros de una tabla, te traes solamente esos.

Código SQL [-]
select campo1, campo42, campo55
from unatabla
where fecha >= '01.11.2012'
order by fecha

Ahí te traes sólamente unos campos que necesitas de una tabla que necesitas y desde una fecha que necesitas, sólamente lo que necesitas.
Responder Con Cita
  #12  
Antiguo 24-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
si, eso lo entiendo, solo tengo que pedir lo que realmente necesite, lo que preguntaba es cuando inicio la aplicacion tengo que asignarle la tabla al query, quiere decir que con poner solo un campo ya me sirve?.

Sobre los campos, en un query, desgraciadamente necesito todos, quiza la clave principal no.
Responder Con Cita
  #13  
Antiguo 24-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por anubis Ver Mensaje
lo que preguntaba es cuando inicio la aplicacion tengo que asignarle la tabla al query, quiere decir que con poner solo un campo ya me sirve?.
No tienes que asignar nada a ningún query cuando inicias la aplicación. Sólamente lo que necesitas.
Responder Con Cita
  #14  
Antiguo 24-11-2012
Avatar de Julián
Julián Julián is offline
Merodeador
 
Registrado: may 2003
Ubicación: en mi casa
Posts: 2.019
Poder: 10
Julián Va por buen camino
Bueno, no te llamaremos burro, pero eso que haces sí que es una burrada.
Es como si teniendo que consultar un libro, pidieras que te trajeran toda la biblioteca. Si la biblioteca está en tu casa, pues ya la tienes ahí. Pero si está en otro edificio tienes que sperar a que la carguen en camiones, y que estos lleguen a tu casa y te la descarguen.

Debes cambiar radicalmentela manera en que haces las cosas: Pide sólo un libro o unos pocos, y te los traerá Casimiro en su moto en dos segundos. Así que hazle caso y olvida el select *.

Vale, y si, como tu dices, ¿los necesitas todos?
En ese caso la soclución también es muy fácil: paginación. Usa una tabla (rejilla o grid o como se diga) con un número limitado de filas, por ejemplo 10, y la rellenas con select * from tabla limit 0,10 (segun la bd podrás usar limit u otra cosa).

Si quieres mostrar un paginador haces un select count para saber el numero total de filas y lo divides por el numero de fials en la rejilla para saber el número de páginas.

Aún así te iría como el puto culo. Por culpa de los campos blobs, que ocupan mucho. Para esto tienes dos socluciones: la mejor es no usar campos blobs y en su lugar guardar el nombre del archivo, el cual solo será enviado al navegador cuando realmente quieras verlo. La otra es no poner un * en el select y en su lugar especificar los campos que no sean blob, y traerte estsos sólo cuando quieras verlos.

Lo que no entoendo es que clase componentes usas, o de que forma lo haces, para que todo eso nque te explico no lo hagan "automáticamente".

Un salaudo!
__________________
"la única iglesia que ilumina es la que arde"
Anonimo

Última edición por Julián fecha: 24-11-2012 a las 22:53:00.
Responder Con Cita
  #15  
Antiguo 26-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
gracias de nuevo por los consejos, de verdad.

Lo que voy a tener que hacer es rehacer todo el programa y aplicar lo que me habeis dicho.

Con respecto a los componentes que uso, es, por un lado, lazarus con los zeos.
Conecto la base de datos, asignaba el select * from, para las tablas (que ya no lohago ), asigno los datasources y de ahi ya las consultas iniciales.

Sobre sacar solo los registros por pagina, es buena solucion, pero como digo, voy a rehacer todo el programa. Aqui la cuestión no es que funcione sino aprender que es la base general y lo importante no desesperarme.

Gracias de nuevo a todos.
Responder Con Cita
  #16  
Antiguo 26-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Tú debes pensar en que estás haciendo un cajero de banco, te habrás fijado que todo es muy simple, sólo pide los datos únicamente necesarios e imprescindibles, realiza una transacción y cuando acaba entonces inicia otra, y siempre pidiendo los datos mínimos posible. Pues ponte en la cabeza algo así.
Si vas a pedir el login y la clave, ¿qué datos te traes? 'select * from tbclientes'?, no, no te traes ninguno. Presentas al usuario el form con el login y la clave y luego buscas sólo el login en la tabla: 'select codigo, login from tbclientes where login= :login'. Si existe entonces procesaremos el password según el codigo que traemos en el select'.
Ahora presentas el menú de opciones al usuario y actuaremos según lo que seleccione, por ejemplo, quiere conocer su saldo, entonces como tenemos su código:
'select saldo from tbclientes where codigo= :codigo'. Nada más, que eso, el saldo, no nos ha pedido nada más.
Y así con todo, es un ejemplo a lo 'bruto', pero para que te hagas una idea de que debe ser siempre lo mínimo posible necesario e imprescindible.
Responder Con Cita
  #17  
Antiguo 26-11-2012
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias nuevamente por las aportaciones.
Me queda totalmente claro lo que me explicas y sí, voy a necesitar reconstruir la aplicación en lazarus porque, para pocas líneas y en monopuesto funcionaba bien, a pesar de que la aplicacion la hice de "andar por casa" pero al pasar de sqlite a firebird y sobretodo en entorno de red, si tarda algo, y mucho más en forma remota.
Voy a tener que buscar información sobre los procedimientos, vistas, triggers etc de las bases de datos porque ando perdido.

Pero ya os preguntare si me seguís dando opción.
Responder Con Cita
  #18  
Antiguo 26-11-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
No creo que tengas que rehacer todo, basta conque le des una manita de gato a todo donde pusiste "select *...", por lo demás te andará bien. Otro consejo, puedes irte olvidando de las tablas como un todo e ir penando en las querys como "la parte de las tablas que necesitas para trabajar en un momento dado" Eso te va a funcionar siempre. Recuerda que un query no es mas que una "pregunta" o "consulta" a una base de datos, quien se encarga de atendertela lo mas rápido posible. El ejemplo que te pusieron de la librería está genial, lo explica todo de una manera muy sencilla. Ah y falta otra cosa, no nada mas tenemos que filtrar bien los querys, sino pedir los datos que vamos a utilizar realmente. Imagínate una tabla con 100 campos en donde hay varios blobs e información diversa que no puede ser distribuida en otras tablas para mantener toda la información en un solo lugar. Obviamente en ningún caso vas a utilizar los 100 campos a la vez..ahi está la clave.


Hay que acostumbrarse a que toda consulta debe llevar filtros siempre, a menos que sean tablas que nunca se espera crezcan mas allá de unos cuantos registros o siempre tengan el mismo número de ellos.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
Respuesta



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
Problemas con conexión a una Base de datos remota. germancbaarg Conexión con bases de datos 1 24-04-2008 20:45:00
Conexión a base de datos remota martinzcr Firebird e Interbase 3 27-08-2007 19:46:00
Conexion remota a Base de datos jorelivi Servers 1 22-06-2007 22:50:11
Lentitud: Conexion a dos bases y dos exe Alexander Conexión con bases de datos 1 13-06-2007 20:28:54
Conexion a Base de Datos Remota juanjoassenza Firebird e Interbase 3 12-03-2005 01:35:00


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


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