Performance de una funcion filter grid con AS/400

Obsydian, Cool:Plex, Advantage Plex, AllFusion Plex...

Moderadores: Jorge Ubeda, pacopicon

Performance de una funcion filter grid con AS/400

Notapor AclamSabuc » Jue Oct 13, 2005 8:24 pm

Tengo una función que hereda de filter Grid.

El archivo tiene 15 campos y cerca de 4000 registros. Para mostrarme un registro usando el filtro tarda aproximadamente 30 segundos. Es demasiado!

¿Cuales son las consideraciones de performance para usar el pattern "Filter" en un ambiente AS/400 :?:

¿Si en una función editdetail también heredo de la función filterGrid, no puedo omitir campos en la vista Filter :?:

Saludos,
Aclam Sabuc
AclamSabuc
 
Mensajes: 25
Registrado: Jue Oct 13, 2005 4:25 pm

FilterGrid

Notapor Melly » Dom Oct 16, 2005 5:32 am

Hola, de acuerdo a lo que conozco de este patron el programa hace una comparacion registro a registro sobre el archivo ( lo que se llama un Scantable), la unica forma en que es rapido es cuando se escoge filtrar campos que estan en la llave de la vista ( y esto obviamente porque la vista esta organizada asi).
Si entendi bien la regunta quieres mostrar solamente ciertos campos en la ventana donde se seleccionan los criterios? si es asi simplemente debes incluir los campos en la variable local exclude ( o algo similar no recuerdo si se llama exactamente asi).

Saludos

Melly
Melly
 

Notapor pacopicon » Lun Oct 17, 2005 11:00 am

Hola:

Otra posibilidad que podrías considerar si ves que el rendimiento utilizando el Filter no es aceptable es la de ver por cuantos campos distintos te pueden hacer la selección y si no son muchos crearte vistas por esos campos. Luego te haces una función genérica y dentro en función de los criterios por los que te han seleccionado utilizar una u otra vista (el BlockFetchSet de esa vista). En la función que cargas el Grid sustituyes la función Entidad.Vista.BlockFetch por esta de recuperacíon genérica.



Saludos,

Paco Picón
Paco Picón
www.metadata.es
pacopicon
 
Mensajes: 121
Registrado: Lun Oct 03, 2005 12:28 pm
Ubicación: Málaga - España

Otra idea

Notapor Invitado » Lun Dic 05, 2005 5:58 pm

Buenas,

primero de todo agradecer la fundación de este foro en el que intentaré participar activamente!

Nosotros hemos descartado hacer filtros por el método tradicional "comparación".

Hay una alternativa muy rápida valida contra AS400 que consiste en realizar un OPNQRYF al carga la BlockFetch. De esta forma en la sentencia opnqryf puedes especificar los criterios de selección, e incluso realizar busquedas por contenido, con lo que la selección la realizas en el AS400 sin crear ninguna vista adicional (la vista por decirlo de alguna forma se crea en tiempo de ejecución y mientras se esté ejecutando).

Es un poco "chapuza" pero el resultado cuando tienes varios millones de registros es increible!
Invitado
 

Notapor Adolfo » Lun Dic 05, 2005 6:09 pm

Ups, olvide logarme. El de antes era yo.
Adolfo
 
Mensajes: 27
Registrado: Lun Dic 05, 2005 5:47 pm
Ubicación: Madrid - España

Notapor AclamSabuc » Lun Dic 05, 2005 7:04 pm

Hola Adolfo:

¿Cómo hago para cargar el Grid con el resultado del OPNQRYF? ¿Tendrás un ejemplo del uso del OPNQRYF?

Muchas gracias por tu respuesta

Saludos,
Aclam Sabuc
AclamSabuc
 
Mensajes: 25
Registrado: Jue Oct 13, 2005 4:25 pm

Re: Otra idea

Notapor Jorge Ubeda » Lun Dic 05, 2005 7:50 pm

Hola Adolfo,
Tu solución me interesa, pero quiero tener en claro algo. Según tu idea:
Anonymous escribió:Hay una alternativa muy rápida valida contra AS400 que consiste en realizar un OPNQRYF al carga la BlockFetch. De esta forma en la sentencia opnqryf puedes especificar los criterios de selección, e incluso realizar busquedas por contenido, con lo que la selección la realizas en el AS400 sin crear ninguna vista adicional (la vista por decirlo de alguna forma se crea en tiempo de ejecución y mientras se esté ejecutando).

Tu blockFetch es parecido a los que generarías usando SQL, es decir, usas una función fantasma, asociada a una vista estándar, por la clave primaria de tu tabla, y luego utilizas un source code que llama al OPNQRYF pasándole los parámetros que te hicieran falta. Es así? En ese caso es dinámico, pasándole los atributos que quieras manejar.

Anonymous escribió:Es un poco "chapuza" pero el resultado cuando tienes varios millones de registros es increible!

Construír un OPNQRYF tiene usualmente una penalidad en performance al crearse. Es así? En qué release de AS/400 trabajas?
Jorge Ubeda
Site Admin
 
Mensajes: 229
Registrado: Mié Oct 26, 2005 6:00 pm
Ubicación: Valencia

Notapor Jorge Ubeda » Lun Dic 05, 2005 8:00 pm

pacopicon escribió:Otra posibilidad que podrías considerar si ves que el rendimiento utilizando el Filter no es aceptable es la de ver por cuantos campos distintos te pueden hacer la selección y si no son muchos crearte vistas por esos campos. Luego te haces una función genérica y dentro en función de los criterios por los que te han seleccionado utilizar una u otra vista (el BlockFetchSet de esa vista). En la función que cargas el Grid sustituyes la función Entidad.Vista.BlockFetch por esta de recuperacíon genérica.

Hola Paco y todos,
Una solución que implementara un colega mío, que reune características más que aceptables, fue usar SQL, construyendo un select dinámico según necesidad. Limitación: se usó SQLRPG. Las características son semejantes a las de utilizar un EXEC SQL en ODBC para armar el BlockFetch. No tengo los detalles, pero creo que se puede entender e implementar.
Jorge Ubeda
Site Admin
 
Mensajes: 229
Registrado: Mié Oct 26, 2005 6:00 pm
Ubicación: Valencia

Notapor Adolfo » Mié Dic 07, 2005 9:22 am

Buenas,

basicamente el código que habría que introducir es el siguiente:

Código: Seleccionar todo
:::  C                     CLOSEXXXXXXXX                               
      *                                                                 
:::  C                     MOVEL&(1:)     YZCMD     P                   
:::  C                     EXSR CMDEXC                                 
:::   *                                                                 
:::  C                     MOVEL&(2:)     YZCMD     P                   
:::  C                     EXSR CMDEXC                                 
:::   *                                                                 
:::  C                     OPEN XXXXXXXX                               
:::   *                                                                 
:::  C                     MOVEL&(3:)     YZCMD     P                   
:::  C                     EXSR CMDEXC                                 
:::   *                                                                 
:::  C                     MOVEL&(4:)     YZCMD     P                   
:::  C                     EXSR CMDEXC                                 
:::   *             


Hay que tener en cuenta que este código debe ser lo primero en ejecutarse y que únicamente se debe ejecutar una vez (vamos cuando position = Yes, por hablar en plata).

Como veis el api tiene cuatro parametros. Estos parametros son cadenas de texto.

El primero debería contener algo así:

Código: Seleccionar todo
OVRDBF FILE(XXXXXXXX) LVLCHK(*NO) SHARE(*YES)


El segundo es el propio OPNQRYF

Código: Seleccionar todo
OPNQRYF FILE((XXXXXXXX *FIRST)) OPTION(*INP) QRYSLT('%XLATE(YYYYYY QSYSTRNTBL) *CT "ZZZZ" ')  KEYFLD(*FILE) SEQONLY(*NO)


El tercero:

Código: Seleccionar todo
CLOF OPNID(XXXXXXXX)


y el cuarto:

Código: Seleccionar todo
DLTOVR FILE(XXXXXXXX)


En las cadenas pues hay que tener en cuenta que XXXXXXXX es la vista sobre la que "reposa" la funcion BlockFetch (o GetSequential).

YYYYYY en este caso representa el campo por el que queremos hacer el filtrado. En este caso lo que hacemos es ponerlo en mayusculas en tiempo de ejecución y compararlo con ZZZZ, que es la cadena que queremos buscar.

Si podeis probadlo y ya me contareis que tal. No os puedo dar mucho soporte pq la verdad es que con el código RPG y algunas cosas del as400 me pierdo, así que no me pregunteis que hace exactamente cada parametro pq no lo se.

En cuanto a las dudas sobre el rendimiento. Bueno, pues os comenta mi experiencia.

Nosotros tenemos esto sobre un fichero con 350.000 registros y el tiempo de busqueda de una cadena en todo el fichero se reduce a unos 10-15 segundo en red local. Si tenemos en cuenta que con un ScanTable tardabamos mas de 10 minutos creo que merece la pena!

Hay una consideración a tener en cuenta. Me parece que esta solucion no vale con tablas con campos virtuales, ya que en algunos casos Plex genera sus propias tablas virtuales, aunque no estoy muy seguro pues nunca he tenido necesidad de probarlo.

Un saludo.
Adolfo
 
Mensajes: 27
Registrado: Lun Dic 05, 2005 5:47 pm
Ubicación: Madrid - España


Volver a Plex

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron