PDA

Ver la Versión Completa : Locate lentísimo


buitrago
04-04-2004, 08:37:56
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

jachguate
04-04-2004, 08:49:16
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. ;)

marcoszorrilla
04-04-2004, 11:50:55
Si no actúa con rapidez es porque no tienes un índice declarado para la búsqueda que estás efectuando.


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.

buitrago
04-04-2004, 23:05:49
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

Mick
05-04-2004, 00:07:22
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

marcoszorrilla
05-04-2004, 07:58:27
La ayuda a la que me refiero es de las IBX.

Un Saludo.

Voutarks
05-04-2004, 14:01:44
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.

kinobi
05-04-2004, 14:25:58
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.