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 04-04-2004
buitrago buitrago is offline
Miembro
 
Registrado: sep 2003
Posts: 156
Poder: 21
buitrago Va por buen camino
Locate lentísimo

Por que puede pasar, uso FireBird 1.5, y cuando hago un Locate se pone lento que casi me bloquea el PC, ya borré la basura, pero sigue en lo mismo.

La tabla posee tres tablas colgadas a través de LookUps y tengo 6516 registros...

Gracias
Responder Con Cita
  #2  
Antiguo 04-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Es que locate es realmente ineficiente. No podes cambiar tu código para que use FindKey?? o bien lanzando SQL's directamente contra la base de datos??

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 04-04-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si no actúa con rapidez es porque no tienes un índice declarado para la búsqueda que estás efectuando.

Cita:

Locate returns True if it finds a matching record, and makes that record the current one. Otherwise Locate returns False.

Locate uses the fastest possible method to locate matching records. If the search fields in KeyFields are indexed and the index is compatible with the specified search options, Locate uses the index. Otherwise Locate creates a filter for the search.


Resumiendo para no traducir toda la ayuda al respecto, si los campos por los que se busca están indexados y el índice es compatible con las opciones de búsqueda especificadas, Locate utiliza el índice. En caso contrario crea un filtro para la búsqueda.

En este último caso, no tener un índice apropiado, vuelve la búsqueda muy lenta, la solución sería o bien crear un índice apropiado o sino abstenerse de dicha instrucción y utilizar simplemente SQL como te indica el compañero JachGuate.


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 04-04-2004 a las 11:53:13.
Responder Con Cita
  #4  
Antiguo 04-04-2004
buitrago buitrago is offline
Miembro
 
Registrado: sep 2003
Posts: 156
Poder: 21
buitrago Va por buen camino
sigue lento......

Pero.....es busqueda por la Llave Primaria, y sigue lento......

Locate sé que busca el Indice si la cadena de campos lo posee, een este caso es la llave primaria....

saludos
Responder Con Cita
  #5  
Antiguo 05-04-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
El comando locate solo puede usar indices en motores de bases de datos que no sean cliente/servidor como Paradox/Dbase, etc. Estos tipos de base de datos son navegacionales de modo que se puede leer del servidor un solo registro de una tabla, por ejemplo el ultimo registro, sin necesidad de leer los registros anteriores (utilizando como ayuda un determinado indice).

En los motores c/s no existen tablas a las que se puedan acceder directamente, solo se pueden ejecutar sentencias SQL que devuelven determinados resultados. Y estos resultados no son navegacionales.

Si haces un SELECT * FROM TABLA, el resultado son todos los registros, si a esta sentencia le aplicas un Locate, no hay mas remedio que recorrer uno por uno todos los resultados de la sentencia para localizar los registros que cumplan la condicion, y aunque el resultado de la query este ordenado no puedes ir directamente a la 'Z' sin haber leido anteriormente todos los registros que comiencen por 'A','B', etc,etc.

Si quieres que las busquedas vayan rapidas tendras que ejecutar una sentencia SQL que te devueva solo unos pocos registros, aquellos en los que estes interesado (ajustando adecuadamente las condiciones de la clausula WHERE de la sentencia).

Saludos
Miguel
Responder Con Cita
  #6  
Antiguo 05-04-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
La ayuda a la que me refiero es de las IBX.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 05-04-2004
Avatar de Voutarks
Voutarks Voutarks is offline
Miembro
 
Registrado: jul 2003
Ubicación: Islas Canarias
Posts: 118
Poder: 21
Voutarks Va por buen camino
Lo tuyo tiene muy fácil solución.

En primer lugar, ¿tu estas mostrando un grid con seis mil y pico registros? porque eso no es un buen diseño para aplicaciones en red. Es el típico error en el que caemos todos los que pasamos de sistemas locales navegacionales a sistemas cliente/servidor. No tiene sentido que tengas abierto un conjunto de datos tan grande y localizar un registro concreto de esa manera.

Regla número 1: no hay que mostrar nada hasta que el usuario introduzca qué quiere buscar de una manera concreta. Y no hay opción para mostrar todos los registros. Si tienes un grid queda mas 'bonito' ocultarlo y mostrar otra cosa hasta que se haga la búsqueda (como alguna imagen). Lo ideal sería tener en el servidor un procedimiento almacenado que haga la consulta y cuente los registros; si son más de 200 se lanza un evento y entonces se le informa al usuario de que tiene que especificar más la búsqueda. La excepción a esto sería cuando se hacen consultas informativas o estadísticas. Pero para eso lo más recomendable es que se haga en otra parte del programa, específica para ese tipo de menesteres y con características particulares.
Lo que quiero decir, finalmente, es que muy pocas veces tiene sentido mostrar un grid, o más generalmente, tener abierto un conjunto de datos navegable, con más de 150 o 200 registros.

¿Que hacer? Lo que ya se ha dicho: utilizar sql. Si se quiere simplemente recuperar un registro yo utilizo un componente sql ligero, sin cursores bidireccionales, lanzo la consulta, recupero el registro, que de esta manera se hace de forma casi-instantánea incluso para tablas grandes si están bien puestos los índices, y luego hago con él lo que quiera.

Aun a riesgo de caer pesado repito: si lo que quieres es localizar un registro, es decir, mover el cursor, a un registro concreto dentro de un conjunto de registros grande, como una tabla entera, los cuales estás mostrando en panalla, no le des más vueltas, no tiene razón de ser; cambia el chip.
__________________
Emilio J. Curbelo
Responder Con Cita
  #8  
Antiguo 05-04-2004
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Cita:
Empezado por Voutarks
Regla número 1: no hay que mostrar nada hasta que el usuario introduzca qué quiere buscar de una manera concreta. Y no hay opción para mostrar todos los registros.
y regla número 2: no sólo filtrar en la dimensión de las filas, sino también en las columnas. Las consultas tipo "SELECT *" no son una buena práctica.

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 02:51:49.


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