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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2004
Abelardo Abelardo is offline
Registrado
 
Registrado: abr 2004
Posts: 6
Poder: 0
Abelardo Va por buen camino
Question Busqueda de un registro con IBQuery

Estoy tratando de posicionarme en un registro utilizando un IBQuery que tiene mas de 100mil registros, se que el locate es lentisimo y entiendo que es deficiente para bases de datos Interbase, este IBQuery lo tengo asociado con un IBUpdateSQL pero desconosco si se puede utilizar en FindKey los ejemplos que eh visto son para IBTable y no creo que me sirva!

Alguien podria darme una referencia para el IBQuery?

Gracias por adelantado!
Responder Con Cita
  #2  
Antiguo 09-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola.

Considero que ningún método parecerá eficiente al tratar de "navegar" en el cliente por un dataset de 100,000 registros, y yo consideraría un problema de diseño de la aplicación tener semejante cantidad de datos a disposición de un usuario.

Es recomendable restringir la cantidad de datos que viajan al cliente. Por regla general, si un dataset tiene mas de 300 registros, pueden todavía afinarse los criterios del query para restringirlo mas. También es dificil que un usuario pueda sacar algun provecho de tener un dataset con mas de 100 o 200 registros.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 09-06-2004
Abelardo Abelardo is offline
Registrado
 
Registrado: abr 2004
Posts: 6
Poder: 0
Abelardo Va por buen camino
Hola otra vez aqui!

Yo no considero que sea error de diseño en la base de datos ya que haciendo la misma prueba con una tabla hecha en padarox y utilizando el metodo locate la respuesta es casi inmediata, obiamente la busqueda que hago es por medio de un campo indice.

Ahora haciendo el mismo ejemplo con una tabla de interbase la respuesta no es tan inmediata, el metodo locate no funciona.

Lamenteblemente la ayuda que tengo y la poca informacion de Interbase con respecto a estos metodos es poca, escaza y en ocaciones confusa, la razon porque requiero tener una tabla con una catidad exagerada para algunos de 100,000 son por varias razones una de ellas es el numero de transacciones que se manejan a diario.

Estoy utilizando el componente IBQuery para que no se mal entienda que estoy utilizando un IBTable
Responder Con Cita
  #4  
Antiguo 09-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola

Yo no he dicho que sea problema de diseño de la base de datos. He dicho que yo lo consideraria un problema de diseño de la aplicación.

Es perfectamente correcto tener una tabla con cientos de miles o millones de registros. Lo que no me parece correcto es intentar llevar todos estos registros a un cliente.

Supongamos que es la tabla de facturas. Para que querrá un usuario tener 100,000 facturas a la vista (si es que pudiera verlas de alguna forma). Lo que regularmente se hace es pedir al usuario que acote un "rango" de facturas que le interese. Entonces podrias tener solamente las facturas de ayer. Digamos 100. Si normalmente son mas de 300... entonces le pedis que te indique si las de la mañana o las de la tarde.... en fin....

He puesto solo un ejemplo tonto... puede ser que lo que le interese sean las facturas de cierto vendedor... o las que incluyan cierto producto, siempre dentro de un rango de fechas.

La diferencia del porque el locate te funciona mejor con paradox que con IB, en principio, son que PDX al ser una base de datos plana, el BDE puede aprovechar un indice para "acercarse" al registro que busca. En el caso de Interbase, los 100,000 registros tienen que viajar primero al cliente (en primer lugar saturando la red). Luego, aun cuando tengas indices en el servidor, estos no pueden ser aprovechados por la aplicación de esta forma.

En cambio si haces un Select con un predicado que filtre los registros en el servidor los indices si serán aprovechados.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 09-06-2004
Abelardo Abelardo is offline
Registrado
 
Registrado: abr 2004
Posts: 6
Poder: 0
Abelardo Va por buen camino
Gracias por tu ayuda tal vez no me eh explicado bien pero no lo estoy haciendo sobre un servido aun.

Ahora bien explicando un poco acerca de mi aplicacion el motivo por el cual se desea tener toda la informacion es porque el cliente asi lo necesita para tomar deciciones, ellos manejan gran cantidad de materiales, algunos de ellos compuestos por otros materiales. Esa es la razon por la cual no he hecho un select condicionado, ni eh puesto filtros, donde lo estoy utilizando es en un catalogo!

Realmete lo que menos me preocupa es traer la informacion sino cuando deseo buscar sobre el grid alguno de los materiales el metodo locate simplemente se pone lento!

Baje la cantidad de registros solo por si acaso de 100,000 a solamente 6mil y tarda lo mismo!

Solo deseo posicionar el cursor del grid sobre el material que deseo encontrar. Me preocupa que interbase no pueda utilizar los recursos del BDE como lo hacen otras bases de datos, si ya lo hice en paradox y funciono no entiendo porque no se puede hacer en interbase!

Gracias!
Responder Con Cita
  #6  
Antiguo 10-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Abelardo
pero no lo estoy haciendo sobre un servido aun.
En interbase/firebird siempre trabajas sobre un servidor, aunque ese mismo servidor sea tu propio equipo; hay un "servidor de bases de datos" que es quien procesa las sentencias SQL (create, insert, update, delete, drop, etc), y si es necesario "sirve" los datos al cliente (tu aplicación).

Cita:
Empezado por Abelardo
el motivo por el cual se desea tener toda la informacion es porque el cliente asi lo necesita para tomar deciciones
No conozco a una sola persona que pueda tomar una decisión basado en 100,000 registros planos y pelados... Cuando son decisiones operativas, basta con unos cuantos registros detallados para tomar una decisión. Cuando son decisiones gerenciales, regularmente los datos se resumen para mostrar solo un puñado de registros, con acumulados y promedios.

Cita:
Empezado por Abelardo
donde lo estoy utilizando es en un catalogo!
Si el usuario necesita ubicar un registro, podes pedirle que primero ingrese un criterio de búsqueda, o bien organizarle el catálogo en "paginas" de manera que siempre se muestren solo unos registros.

Cita:
Empezado por Abelardo
Realmete lo que menos me preocupa es traer la informacion
Alli está el problema... si te preocupas un poco por la cantidad de datos que tu programa tendrá que manejar, seguro obtendrias mejores resultados.

Cita:
Empezado por Abelardo
Baje la cantidad de registros solo por si acaso de 100,000 a solamente 6mil y tarda lo mismo!
Seguramente el registro que buscas está dentro de los primeros 6,000; no importa cuantos registros tenga el cursor, sino cuantos registros tendrá que escanear la máquina para hallar el que te interese.

Cita:
Empezado por Abelardo
Me preocupa que interbase no pueda utilizar los recursos del BDE como lo hacen otras bases de datos
Hay una diferencia grande entre usar archivos planos (tipo paradox) y una base de datos real. Tiene sus pros y sus contras... y uno de ellos (si realmente lo es) es que no vas a poder tener al cliente navegando (¿perdido?) entre 100,000 registros.

Cita:
Empezado por Abelardo
si ya lo hice en paradox y funciono no entiendo porque no se puede hacer en interbase!
Si se puede otorgar al usuario lo que necesita; que es información precis..... probablemente un solo registro. Pero para conseguirlo tenes que girar un poco de tu concepción del asunto. Si estas haciendo un locate para ubicar aquellos registros cuyo nombre comience con 'ZAPATO'; ahora que el usuario introduzca primero el criterio de búsqueda... luego haces un query, y paf! En unos cuantos milisegundos tenes a la vista un dbGrid donde el usuario ubicará fácilmente su registro

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 10-06-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

Cita:
Empezado por Abelardo
Solo deseo posicionar el cursor del grid sobre el material que deseo encontrar. Me preocupa que interbase no pueda utilizar los recursos del BDE como lo hacen otras bases de datos, si ya lo hice en paradox y funciono no entiendo porque no se puede hacer en interbase!
Además de lo que ha comentado Juan Antonio, te recomiendo la lectura de este hilo: http://www.clubdelphi.com/foros/show...erbase+paradox, donde ya tratamos el tema (no es el único sobre el asunto)

Saludos
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


La franja horaria es GMT +2. Ahora son las 07:00:44.


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