Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   300.000 registros (https://www.clubdelphi.com/foros/showthread.php?t=61189)

raorre 29-10-2008 12:30:24

300.000 registros
 
Firebird 2.1 y Delphi 2006
Buenas Tardes, haber tengo un problema serio, tengo una tabla con firebird con 300.000 de registros, estos los cargo en un clientdataset, la consulta es simple
SELECT ID,codigo1,codigo2 FROM TTabla ORDER BY codigo1,codigo2
pero claro tarda bastante , hay algun manera de optimizar de alguna forma cursores, etc...
Saludos.

raorre 29-10-2008 12:31:16

ah..
 
los campos que devuelvo estan indexados. (id,campo1,campo2)

enecumene 29-10-2008 12:41:17

Hola, es lógico que te tarde ya que muestras todos los registros de un sólo golpe, con un where la consulta se hace un poco más rápido, mi consejo para esos casos sería usando un procedimiento almacenado o mostrar una barra de progreso mientras se carga, ojalá otro colega te ayude con algo más optimizado.

Saludos.

mightydragonlor 29-10-2008 13:00:09

Hola raorre, la solucion es muy simple, ya que estas utilizando un TClientDataSet solo debes buscar la propiedad PacketRecords y pponer una cantidad X, la cantidad X significa que solo cargará X registros cada vez que que le solicite el dataSource, me explico, si colocas packetRecords en 1000, en un DBGrid se mostraran 1000 registros, solo que al llegar al registro 1000 automaticamente cargará otros 1000 registros y así hasta terminar de cargarlos todos.

raorre 29-10-2008 13:19:46

..
 
Correcto, pero no me vale porque el usuario puede pulsar el boton de ir al final de los registros y entonces me carga todos los 300.000
Lo he probado para q me cargar de 300 en 300 y va bien pero cuando le das al bton de al final te lo cargo todo


saludos

RolphyReyes 29-10-2008 13:54:10

Saludos.

No especificas si lo quieres es realizar una pantalla para ejecutar búsquedas en tu aplicación.

Siendo así el caso, esa metodología que deseas aplicar no es recomendable para ambiente Cliente/Servidor; donde tienes una PC (Servidor) con la Base de Datos que te envía la data a través de la red hasta otra PC (Cliente).

Imagina el trafico de red que estarías generando enviando ese paquete de información aunque estés usando TClientDataSet.

En mi opinión personal, un usuario no necesita navegar por 300,000 registros para encontrar uno especifico se supone que ya sabe de antemano cual registro necesita (o tiene una idea) lo que no sabe es donde esta localizado dentro de la tabla. Partiendo de este pensamiento debes de suministrarle al usuario la forma de buscar e incluso tú por dentro limitar la cantidad de registro que vas a mostrar; en caso de que no este dentro de ese grupo de registro que el usuario sea más especifico.

Ejemplo:
Código SQL [-]
SELECT ID,codigo1,codigo2 
FROM TTabla 
Where codigo1 starting with 'Hola'
ORDER BY codigo1,codigo2
ROWS 300


En mi entorno de trabajo esta es la metodología que aplicamos y hasta ahora nos a funcionado bien.

Espero no haberte cansado con esta explicación.

Caro 29-10-2008 14:02:05

Cita:

Empezado por mightydragonlor (Mensaje 323071)
Hola raorre, la solucion es muy simple, ya que estas utilizando un TClientDataSet solo debes buscar la propiedad PacketRecords y pponer una cantidad X, la cantidad X significa que solo cargará X registros

No conocía sobre esa propiedad, gracias mightydragonlor.

Cita:

Empezado por raorre (Mensaje 323074)
Correcto, pero no me vale porque el usuario puede pulsar el boton de ir al final de los registros y entonces me carga todos los 300.000
Lo he probado para q me cargar de 300 en 300 y va bien pero cuando le das al bton de al final te lo cargo todo

Yo creo que no es buena idea mostrar los 300.000 registros de golpe, deberías darle opciones de busqueda y si los cargas todos no le dejes ir hasta el final.

Saluditos

donald shimoda 29-10-2008 14:10:48

Cita:

Empezado por raorre (Mensaje 323074)
Correcto, pero no me vale porque el usuario puede pulsar el boton de ir al final de los registros y entonces me carga todos los 300.000
Lo he probado para q me cargar de 300 en 300 y va bien pero cuando le das al bton de al final te lo cargo todo

saludos

No trabajes nunca sobre un dataset completo a no ser que sea necesario. Coloca filtros que permitan al cliente seleccionar un subconjunto del dataset, siempre. Educalo sobre la conveniencia en trabajar de esa manera. Te sorprenderás en ver como te agradecen no tener que ver datos que no les interesan.

Saludos.

Delfino 30-10-2008 17:59:08

Cita:

Empezado por raorre (Mensaje 323074)
Correcto, pero no me vale porque el usuario puede pulsar el boton de ir al final de los registros y entonces me carga todos los 300.000

Que probabilidad hay de q pase esto? y q probailidad hay de q el usuario solo necesite ver unos cuantos registros?
La solucion de PacketRecords es la adecuada y existe tb en el componente TIBDataset llamada BufferChunks..

donald shimoda 30-10-2008 21:40:35

Cita:

Empezado por Delfino (Mensaje 323326)
Que probabilidad hay de q pase esto? y q probailidad hay de q el usuario solo necesite ver unos cuantos registros?
La solucion de PacketRecords es la adecuada y existe tb en el componente TIBDataset llamada BufferChunks..

Bueno, sentenciar que una solución es adecuada para cualquier necesidad.:D
En todo caso es una de las alternativas. Acaso tiene más sentido recorrer un conjunto de datos completo buscando datos que filtrar por ciertos campos?:o

Saludos

raorre 03-11-2008 17:10:45

bueno al final he utilizado una mezcla del packedrecords y solo cargando el registro que me interesa..bueno un poco lioso, pero funciona de momento, gracias. unos saludos

rastafarey 03-11-2008 21:24:07

Resp
 
Nos deberias decir que es lo que quieres hacer en realidad. Por que ami personalmente me parece una locura cargar 300.000 registros en un conculta a menos que quieras hacer un reporte todos ellos lo cual tambien me parece ilogico por que de ser eso cierto que los va leer. Asi que el unico modo que veo ncesario es para hacer uana grafica o algo por estilo y de ser asi deberias agurparlo o crear un filtro.

No se es cuestion de saber para que lo quieres.

Lo que si te digo es que no tienens manera mortal de reducir el tiempo de la cosulta lo que si podrias es configurar el servidor para tenes mas cache o algo por el estilo o montar la memoria de intercambio en un usb pero tendrias que tenr una mountrocida de maquina y si existiese una maquina con esas caracteristicas te digo que el sisyema operativo para soportar tal cantidad de datos en memoria no seria windows.

Es todo lo que te puedo decir ya que no das muchas opciones de comos e te puede ayudar.


La franja horaria es GMT +2. Ahora son las 05:51:01.

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