anonymous Log in
Search
Recents:
v3.0
csharp-l
Recorridos lentos con for each
03/02/21 07:41

bigorda

Replies: 4

Buenas,
Tengo un proyecto, donde uso dos fuentes de base de datos de dos servidores diferentes.
Los dos, son Microsoft Sql.
En un WebPanel, tengo un grid, donde consulta una serie de datos de una tabla de de una base de datos que diremos DB1.
El listado es rápido, 1400 registros, en apenas 2 segundos. Bien
En un campo de este grid, hay un codigo, que tengo que relacionar con una descripción de otra tabla de la BD2 y mostrar la descripción en el mismo grid. La tabla d ela BD2, tiene 7 registros.
Bien, para conseguir esto, en el evento Load, añado un for each que recorre la tabla de la BD2 por cada registo y me carga la descripcion el el grid.
Pues si hago esto, me tarda en cargar el grid 20 segundos.
Se que es porque tiene que hacer la consulta en base de datos distintas, pero hay alguna manera que se pueda hacer mejor?
gracias.
Salut,
Lluis Bigordà,
-----------------------------------------
Para Suscribirse/Desuscribirse:
http://www.gxtechnical.com/cgi-bin/hforum.exe?2,3,30,11
Por consultas owner-csharp-l@gxtech.com.uy
Replies

guscarr

03/02/21 08:13
LLuis, Lo que entiendo que está pasando es que ejecuta 1200 selects a la DB2 (uno por cada registro de la DB1) y eso es “pesado”. 20seg es mucho? Bueno, depende de donde esté cada componente, carga de servers y eso. Como son dos DB separadas no hay “joins” entre ellas. Si la tabla de la DB2 tiene un numero tan pequeño de registro (ejemplo: una tabla con las sucursales de una empresa o cualquier cosa de baja cardinalidad) capaz lo que te conviene es cargarla en un SDT al principio y hacer un “For in”: https://wiki.genexus.com/commwiki/servlet/wiki?6296,Implementing%20SDT%20collections Eventualmente hay un modo mejor de hacerlo con incluso con SDTs pero ahí depende del caso específico, sea como sea, seguro usar un SDT te puede servir. Cuando digo “baja cardinalidad” es porque hay que considerar que el SDT es una estructura de memoria entonces no sería razonable poblarla con miles de registros por lo que ocupan e incluso lo que demora el “for in” recorriéndolos cada vez. Saludos, Gustavo *

bigorda

04/02/21 06:36
Creo que la saolución, es esta, la de usar los SDT's, mas que nada, quería saber si habíaalguna manera que desconocía para hacer esto. Gracias por la ayuda. Salut, Lluis Bigordà, ----- Mensaje original -----

r.castro

04/02/21 23:11
La forma más sencilla es con la carga previa en un sdt (como dice en el correo anexo si tiene pocos registros) También afecta si el grid es con tabla base, con tabla base recorrerá y buscara en la BD2 solo los registros necesarios para mostrar en la página que te encuentres, es decir si tu grid página de 10 en 10 registros y estas en la página 5, internamente Genexus buscara 50 descripciones en la bd2 aunque los primeros 40 no se visualicen (esto depende de la versión de Genexus y de dbms) Otra opción es controlar que solo se busque en la bd2 los registros que se mostraran en pantalla, puedes conseguirlo con contadores (saber en qué registro estas y donde termina y en un if condicionar este segundo foreach) o también con paginación con dataprovider https://wiki.genexus.com/commwiki/servlet/wiki?15361,Server+Paging+%28Spa%29 Rodrigo Castro Medina Líder de Proyecto Tel: +52 55 5254 4648 Web: www.alphasoluciones.com Dir: Av. Cuauhtémoc 1400, Santa Cruz Atoyac. Al. Benito Juárez C.P 03310 P Por favor considera el medio ambiente antes de imprimir este correo El contenido de este correo electrónico y sus anexos son de carácter CONFIDENCIAL, y es para uso único y exclusivo del destinatario por lo que se prohibe su divulgación total o parcial a cualquier tercero no autorizado. Las opiniones que aquí se expresan son responsabilidad del remitente y no son necesariamente compartidas o respaldadas por ALPHA SOLUCIONES, a menos que dicha información sea confirmada por escrito por un representante autorizado.

bigorda

05/02/21 04:19
Gracias Rodrigo, Salut, Lluis Bigordà, ----- Mensaje original -----


Back to csharp-l