Acelerar busqueda con indices complejos


([N1] Spicer) #1

Amigos,

Tengo una busqueda con indices complejos, la cual llamo desde un proceso mediante la instrucción “Cargar lista de indice complejo”. Rescato el resultado mediante una cesta, y eso lo inyecto a una rejilla. Es una búsqueda con sólo dos componentes, nada del otro mundo.

El resultado es perfecto, me da lo que necesito. El problema, es que es leeeento… puede demorar 6 ó 7 segundos, con unos 5.000 registros, lo cual no es aceptable. Sobre todo, la primera vez que el usuario hace la búsqueda; las siguientes, es mas rapido.

Por eso, me pregunto si me pueden compartir algun truco para acelerar esto, ya que esto forma parte del nucleo de mi aplicación y tiene un enorme impacto sobre la experiencia de los usuarios. Intenté hacer busqueda en 3er plano pero no logro recoger el resultado en una cesta. Además, como es una busqueda simple, no sé si valga mucho la pena.

Gracias!


([N4] Paco Satué) #2

Hola Spicer.

Lo que tienes que tener claro siempre es que las búsquedas por índice, ya sean normales o complejos, son siempre rapidísimas. Teniendo en cuenta esto, debes analizar qué parte de tu aplicación está mal diseñada para que se produzca esa lentitud.

  • Primero comprueba la aplicaciòn en un servidor Local. Si la visualización de los registros es normal, entonces es que tienes un problema de velocidad en la red de Internet con el servidor remoto.
  • Devolver 5000 registros desde un servidor remoto no debe ser problema. La lentitud puede ser debida a “cómo está construida la Rejilla”. Revisa las columnas de dicha Rejilla, evitando los punteros virtuales que son los que generan, por cada fila, una nueva conexión (sockect) con el servidor remoto y produzcan ese retardo.
  • Si la búsqueda es de un solo Índice, efectívamente ejecutarla en tercer plano no acelera la descarga. Lo que sí acelera la visualización en la Rejilla es tener los contenidos de las columnas en caché, por eso la segunda vez es más rápida la visualización.
  • Existe un truco que consiste en ejecutar esa búsqueda en 2º plano al comienzo de la aplicación, de tal forma que se rellene la caché con los registros afectados. De esta forma la primera vez que mostremos la Rejilla, las columnas se nutrirán de la caché en lugar del servidor remoto.

Pruébalo.
Saludos
Paco Satué


([N1] Spicer) #3

Estimado Paco,

Disculpa la tardanza. Finalmente tuve que inventar una entelequia (tabla intermedia que graba los datos a medida que son generados) y hacer la búsqueda sobre esa tabla, pues de lo contrario, los tiempos eran demasiado lentos, y la búsqueda sucede a cada rato, no podía someter al usuario a eso.

Ahora bien, ejecutar la busqueda en 2do plano, nunca lo pude hacer. Actualmente la disparo desde un manejador de evento con “Crear manejador de objeto” para el proceso que la realiza, y luego “Disparar objeto”, pero no me da la opción de 2do plano, sino sólo 1°, 3° y 4°. En realidad, nunca he usado eso del 2do plano.

Gracias de todos modos


([N4] Infortic) #4

Para ejecutar una búsqueda en 3er plano tienes que crear un proceso que lanza la busqueda, con entrada vacía y salida lista de la tabla a devolver.

Por ejemplo si es una busqueda sin formulario con 2 parámetros FCH_INI y FCH_FIN de la tabla FACTURAS que se llama BUS_FACTURAS.

Creas un proceso BUS_FACTURAS_3P: entrada: vacio salida: FACTURAS LISTA

Variable: FCH_INI fecha
Variable: FCH_FIN fecha

Crear manejador de objeto (Búsqueda BUS_FACTURAS)
Set variable local de objeto (FCH_INI , FCH_INI)
Set variable local de objeto (FCH_FIN , FCH_FIN)
Disparar objeto
Añadir lista a la salida

Y lo que ejecutas es el proceso en 3er plano en lugar de la búsqueda:

Crear manejador de objeto (Proceso BUS_FACTURAS_3P)
Set variable local de objeto (FCH_INI , FCH_INI)
Set variable local de objeto (FCH_FIN , FCH_FIN)
Disparar objeto(3er Plano)

Esto mejora la velocidad cuando la búsqueda tiene varios término que se cruzan. Ya que todos los términos y sus cruces se ejecutan en el servidor y se devuelve la lista ya cruzada.

Cuando la búsqueda tiene un sólo término no hay mejora de velocidad al ekecutarla en 1er plano o en 3er plano.

Sobre lo de que sea lento con un índice complejo, habría que ver el índice, es raro que se demore tanto.


([N1] Spicer) #5

Estimado Infortic,

Muchas gracias; lo que necesitaba era ejecutar el proceso en 3er plano y recoger el resultado en una cesta global, pero no hubo caso.
Al final asumí que al ser en 3er plano, el resultado, si es una lista, queda en el limbo. Quizá me equivoque.


([N4] Infortic) #6

Hola.

No te equivocas, las variables en memoria se quedan en el plano de ejecución en el que se ejecutaron, si modificas una variable en 3er plano y la consultas desde primer plano, o tiene valor.

CREO que con las cestas globales pasará lo mismo, la verdad es que no lo he probado.

Lo que tenes es un proceso que se va a ejecutar en 3er plano, el cual te devuelve unos registros.

Para usarlo lo que harás es crearte un proceso o manejador que se ejecuta en 1er plano. Este proceso llama al que se ejecuta en 3er plano y guarda los registros en la cesta, así el guardado de registros se hace en primer plano, aunque el grueso de la computación se ha hecho en la parte del servidor.


([N3] pacosatu) #7

Hola Spicer.

Dices

Al final asumí que al ser en 3er plano, el resultado, si es una lista, queda en el limbo. Quizá me equivoque

Solo queda aconsejarte que revises la documentación sobre planos de ejecución y los conceptos de entrada y salida de los procesos.

Es realmente sencillo y muy potente ejecutar procesos en diferentes planos en Velneo.

Saludos
Paco Satué


([N1] Spicer) #8

Estimados Paco e Infortic,

Muchas gracias por vuestras aportaciones. En realidad, los procesos en 3er plano los ocupo bastante, pero esta es la primera vez que enfrento la necesidad de que uno de estos procesos tenga una salida, y que yo deba capturarla para trabajar con ella.

Por otro lado, veo que para usar el 2do plano, la opción es usar el comando “Ejecutar proceso”, el cual no me permite definir parámetros; hasta ahora, ocupo “Crear manejador de objeto” / “Set variable local de objeto” / “Disparar objeto”, y eso hace que la ejecución en 3er plano vaya bien, pues le paso los parámetros al objeto y me olvido. No entiendo por qué esta modalidad no permite ejecutar en 2do plano. El comando “Ejecutar proceso”, al no permitir definir parámetros, me obliga a usar variables globales, que por esencia no me gustan mucho.


([N3] pacosatu) #9

Hola Spicer.

Entiendo que tienes problemas con los conceptos de Proceso y Planos de ejecución.

Resumiendo algunas ideas:

  • Los procesos en 2º plano se ejecutan de forma asíncrona (no detiene la ejecución principal) y por esta razón no se puede usar el comando “Disparar objeto”, el cual necesita la ejecución síncrona (detiene la ejecución principal hasta que termina el proceso).
  • Solo podemos devolver datos en aquellos procesos que se ejecutan de forma síncrona, ya sea en 1P o 3P. En realidad lo que hace el proceso es devolver un Destino en forma de Ficha o Lista usando los comandos “Añadir Ficha/Lista a la salida”.
    ¿Dónde accedemos a esa Ficha o Lista devuelta? Pues en el subproceso tanto del comando “Ejecutar proceso” como “Disparar objeto”.

Por lo tanto, usa el proceso en 3P y devuelve la Lista con “Añadir lista a la salida”.

Saludos
Paco Satué

P.D. Precisamente ahora en el canal youtube de Velneo está empezando un nuevo curso del Lenguaje, y casualmente se inicia hablando de planos de ejecución y origen/destino de procesos. Échale un vistazo.