Pregunta: | 47899 - CURSOR BIDIRECCIONAL RESTRINGIDO |
Autor: | Luis Macias |
Buenas!!
Tengo un problema, a ver si me pueden ayudar y es el siguiente: He generado una aplicacion que en el momento de buscar por diversos criterios hay ocaciones que el regreso de datos es de varios miles de registros, mis aplicaciones corren en un terminal server y esto provoca que la maquina se quede sin memoria. Hablando con el administrador de la base de datos, resolvimos generar un cursor declarado como variable de instancia de manera que el cursor este abierto si el usuario requiere mas registros y por cada lectura solo leeria 500 registros a la vez, me encontre que no puedo "regresar" a la informacion vista en un bloque anterior. Por lo que genere una tabla temporal que almacena los registros leidos y una marca de numero de bloque leido, asi con una variable ya se si el bloque nuevo lo tengo que ller de la temporal o del cursor declarado en la instancia. Pues bien, aqui se me presento el problema que mis usuarios me tumbaron el servidor (son aproximadamente 800 usuarios haciendo consultas "pesadas"). Como puedo resolver este problema? si requiero: 1) Leer grandes cantidades de informacion en bloques pequeños 2) Que el usuario pueda regresar a la informacion leida en un blque previo. 3) El uso de memoria en el cliente sea limitado. 4) Que la informacion sea almacenada lo menos posible en tablas temporales y/o arreglos. 5) Una vez que el usuario cierre la ventana la informacion ya no la necesito. Estoy trabajando con PowerBuilder 7 e informix 10. |
Respuesta: | Luis Macias |
Quiza no me explique bien, supongan que tienen 10,000 registros y yo requiero leer por vez solo 100 por vez.
La primer lectura se dara con los 100 primeros registros. El usuario le pica a un boton que ejecuta la contunuacion de cursor, y se manda leer del registro 101 al 200. El usuario se desplaza hasta el bloque donde leera el registro 901 al 1000. Y debe de regresar al bloque donde se lee del registro 101 al 200. Que hago? Tengo un cursor declarado como instancia para este fin. No puedo almacenar los registros leidos (del 1 al 1000), ni mucho menos toda la tabla por cliente (del 1 al 10,000). Tampoco es posible (o no muy recomendable crear una tabla temporal). Mi pregunta es: Existe algun cursor que pudiera ser BIDIRECCIONAL? |
Respuesta: | Hector Mosqueda Gomez |
Hola lo que necesitas es crear indices en tu base de datos, no basta con los indices creados por la llave primaria, debes crear un indice por cada tipo de consulta que hagas ej.
1 la primera busqueda es por fecha = index idx_fecha(fecha) 2 la segunda busqueda es por fecha y valorX = index idx_fecha_valor(fecha, valorx) . .. Y asi sucesibamente, eso va a bajar cañon el tiempo en las busquedas. |