Una de Indices


([N3] veldevelop) #1

Buenos días comunidad, después de un tiempo peleándome con velneo y DB2 por fin he conseguido un equilibrio entre mis consultas externas SQL y la carga de dichas consultas en velneo. Ahora quiero mejorar dicha experiencia y requiero de vuestra ayuda o bien de las ideas de los más experimentados que me puedan aportar.

La importación de datos externos a velneo está muy bien pero…¿De que nos sirve si no podemos exprimir esos datos y optimizarlos en velneo? Como todo novato en velneo vamos realizando programación secuencial vamos a lo que estamos acostumbrados y a día de hoy realizo 3 importaciones de distintas bases de datos:

tabla almacenes campo PN y Orden
Tabla ordenes campo PN y orden
Tabla Pedidos campo PN y orden

Por otro lado me creo una cuarta tabla que relleno con procesos varios que recorren las otras 3 tablas que importo a diario. Como todo buen programador me he preguntado ¿Se podría mejorar esta guarrada que has montado? y como siempre la respuesta es sí, pero… ¿Como?. Había pensado en los índices pero como usarlos si se destruyen y se crean a diario los datos. Gracias a la cantidad de Openapps, documentación y ejemplos disponibles, no termino de digerir el funcionamiento de los índices y por eso lanzo este post.

Como dato adicional os diré que cada tabla importa un montón de datos pero hay muchos datos comunes tales como articulo, orden, cantidad, ubicación, almacén, los más importantes son articulo, orden,ubicación,almacén y cantidad pero la cantidad evidentemente va cambiando.¿Es posible montar mi cuarta tabla con los índices correctos y sin ejecutar procesos de relleno?.

Gracias a todos de ante mano.


([N1] wikan) #2

¿Por qué dices que los índices se destruyen? Vacías las tablas con cada importación??

Los índices son simplemente un…mapeado de donde están los datos que están buscando. Una dirección al fichero de datos.


([N3] veldevelop) #3

Hola Wikan gracias por contestar, efectivamente en cada importación elimino,regenero y reconstruyo los datos de ahí que diga que se eliminan los índices.Igual solo es cuestión de recalcular de nuevo los índices en cada importación.
Pero vuelvo a hacerme la pregunta ¿Y como he de hacer esto???.

Saludos.


([N1] wikan) #4

Lo que no entiendo es, quieres exprimir los datos, te refieres a poder sacar estadísticas y demás. Si es sí, no deberías borrar la tabla si no hacer una importación incremental.

Por otro lado, los índices es normal que se destruyan si eliminas las tabla, realmente no son datos que puedas usar, son mapeados para hacer las búsquedas en la tabla de datos.

La pregunta para continuar es, ¿es una importación incremental o borras tu tabla completa?. En DB2, ¿se borra o se van guardando toda la información?


([N2] Mgalvezh) #5

Hola, Vel, y no sería mejor que explicaras todo el sistema como funciona, y así podernos hacer una idea ? (desde que abandonaste el Irc, la cosa va de mal en peor jeje)


([N3] veldevelop) #6

Hola MGalvez un placer saludarte. Te debo una @ por cierto. Ya nos pondremos al día. Vamos a ver el que no sabe es como el que no ve.
No cuento con un proyecto definido. Necesito mostrar información lo más coherente y cómoda posible y en mi afán de seguir aprendiendo me he puesto esta tarea que no sé por donde cogerla.

3 Tablas con una serie de campos comunes

La tabla pedidos contiene datos de pedidos cantidad, fecha vencimiento,etc y lo común es articulo.
La tabla ordenes tiene información de la orden fecha de lanzamiento, fecha de vencimiento dato común articulo y pedido
La tabla almacenes contiene información del almacén, cantidad, ubicación, articulo y orden.

Si eso lo metemos en la cocktelera (procesos varios) Obtenemos una tabla que dice lo siguiente:

Articulo Almacén Cantidad Orden Cant_OP Pedido pedidas Servidas
F533-002 10 4 17270 10 AER-1286-1 10 0
F533-002 12 6 17270 10 AER-1286-1 10 0
M5724422 7 10 18345 35 JPG-1234-3 100 20
L5332000 14 6 14101 8 LAG-2222-5 8 2

Hay que tener en cuenta que cada vez que se lanza la consulta se borran las tres tablas ya que es más rápido y cómodo que mantener los cambios en 2 sitios(DB2 y Velneo)

Vuelvo a preguntar: ¿Es posible usando indices obtener el resultado requerido?¿Cómo debiera de hacerlo?
¿Es posible con los indices hacer estas cosas sin procesos complejos?

Mi reflexión es: Si puedo resolverlo con indices estas cuestiones me pueden ahorar tiempo de programación ya que muchas veces requiero de mezclar informacion de varias consultas con datos comunes. En este caso he puesto como ejemplo algo de produccion con pedidos pero esto se repite con pedidos albaranes ordenes facturas etc, etc. Espero que ahora se entienda.

Gracias de nuevo a todos.


([N3] veldevelop) #7

Hola MGalvez un placer saludarte. Te debo una @ por cierto. Ya nos pondremos al día. Vamos a ver el que no sabe es como el que no ve.
No cuento con un proyecto definido. Necesito mostrar información lo más coherente y cómoda posible y en mi afán de seguir aprendiendo me he puesto esta tarea que no sé por donde cogerla.

3 Tablas con una serie de campos comunes

La tabla pedidos contiene datos de pedidos cantidad, fecha vencimiento,etc y lo común es articulo.
La tabla ordenes tiene información de la orden fecha de lanzamiento, fecha de vencimiento dato común articulo y pedido
La tabla almacenes contiene información del almacén, cantidad, ubicación, articulo y orden.

Si eso lo metemos en la cocktelera (procesos varios) Obtenemos una tabla que dice lo siguiente:

Articulo----Almacén—Cantidad–Orden—Cant_OP—Pedido-------pedidas---- Servidas
F533-0021041727010AER-1286-1100
F533-002
12617270
10
AER-1286-1100
M5724422
7
101834535JPG-1234-310020
L5332000*****14
614101****8LAG-2222-58***********2

Hay que tener en cuenta que cada vez que se lanza la consulta se borran las tres tablas ya que es más rápido y cómodo que mantener los cambios en 2 sitios(DB2 y Velneo)

Vuelvo a preguntar: ¿Es posible usando indices obtener el resultado requerido?¿Cómo debiera de hacerlo?
¿Es posible con los indices hacer estas cosas sin procesos complejos?

Mi reflexión es: Si puedo resolverlo con indices estas cuestiones me pueden ahorar tiempo de programación ya que muchas veces requiero de mezclar informacion de varias consultas con datos comunes. En este caso he puesto como ejemplo algo de produccion con pedidos pero esto se repite con pedidos albaranes ordenes facturas etc, etc. Espero que ahora se entienda.

Gracias de nuevo a todos.


([N1] wikan) #8

El problema que te veo es que necesitas obtener información cruzada de varias tablas y Velneo esto no lo permite.
Por lo que muchas tenemos que usar tablas en memoria para mostrar los datos que necesitamos.

Creo que si necesitas una cuarta tabla para mostrar todo eso que necesitas, por que con un índice, artículo-almacén-pedido-orden tienes el campo único para acumular cantidades.

Pero claro para poder crear esa tabla debes partir de las otras tres y básicamente siempre usando el artículo como búsqueda.
Procesas pedidos, buscas el artículo del pedido en las ordenes y luego el almacén.

Habría que probar pero quizás haciendo primero una sentencia SQL contra pedidos de DB2 y luego anidar las sentencias para buscar en ordenes y almacenes podrías montar directamente la tabla resultado en Velneo.

Sería cuestión de probarlo y ver que es lo que más rendimiento te ofrece.

  • Importar todo a Velneo y procesarlo.
  • Ir haciendo consultas externas y creando la tabla al vuelo.

([N3] veldevelop) #9

Hola Wikan Gracias de nuevo por tu respuesta. La verdad es que no es posible anidar las consultas por que lo que estoy haciendo es auditar un sistema externo, es decir una ñapa de intercambio de información. Los almacenes se gestionan en un sistema, las ordenes son las mías y los pedidos son los de mi “proveedor”(Empresa del grupo). La verdad es que contamos con un ERP que es una delicia pero mis jefes no caen del burro y ando haciendo encajes de bolillos por lo que toda imaginación para controlar es poca.Pero eso es otra historia.

Le daremos otra vuelta pero creo que de algún modo se puede agilizar todo el proceso, una vez en velneo todo debe ser mucho mas ágil pero… ¿¿¿como???

Saludos.


([N1] wikan) #10

Con la nueva clase de javascript vSqlDataBase supongo que si podrás anidar sin problema y montar la tabla directa.

El problema no creo que tengas con índices, la combinación clave a primera vista es artículo-pedido-orden-almacen. Pero para poder llegar a rellenar ese registro tienes que haber leído las otras tablas primero. Por lo que has tenido que importar.

Realmente que quieres optimizar? se demora tanto?
Ten en cuenta que para mostrar los que necesitas, tienes que tener un tabla de cruce (cuarta tabla)

Si borras todos los días para optimizar…
Podrías usar tablas en memoria para la importación y la cuarta en disco.
Usar sql para leer y la cuarta en disco (javascript seguramente)


([N3] pacosatu) #11

Hola Rodolfo.

¡Hombre! yo creo que tienes delante un proyecto que encaja perfectamente con Velneo y que además te servirá para aprender mucho de la Herramienta.

No sé si he entendido bien tu problema:

  • Tienes que realizar todos los días una importación externa de datos históricos sobre gestión de Almacenes, Pedidos y Órdenes.
  • No sincronizas los datos, sino que vuelves a cargar todos los datos desde cero.
  • El proceso de importación ya lo tienes resuelto.
  • Quieres procesar lo más rápido posible esa información y obtener algo práctico, según dices “Necesito mostrar información lo más coherente y cómoda posible”.

No te voy a resolver el proyecto porque habría que analizar muchos aspectos del diseño, pero ten en cuenta:

  • Deberías primero diseñar la Base de Datos de Velneo tal como quieres que quede finalmente, para que cumpla con tus requerimientos: “Necesito mostrar información lo más coherente y cómoda posible”.
  • Crea los Índices necesarios para las consultas que vayas a necesitar.
  • Crea las actualizaciones necesarias para los agregados que vayas a necesitar.
  • Determina cuáles son las tablas maestras (Artículos, Almacenes, Pedidos, …) para que solo se haga la importación de cada Item una vez, es decir, un artículo identificado con su REF no cambia de una importación a otra.
  • Ejecuta la importación tal como la estás haciendo ahora: almacenes, ordenes y pedidos.
    Estas tablas importadas son temporales en disco y solo sirven de entrada al proceso de carga de datos a Velneo.
    Estas tablas importadas solo contienen el Índice ID para acelerar lo máximo posible la importación.
  • En el proceso de carga de datos a la Base de Datos de Velneo no tienes más remedio que recorrer secuencialmente las tablas almacenes, ordenes y pedidos. Por cada línea, comprueba si existen los maestros, y solo importas el movimiento o histórico.

En cuanto a los Índices.

  • Los Índices ralentizan mucho en la escritura de datos, por eso las importaciones y transacciones son lentas.
  • Los Índices aceleran las consultas, por eso en una base de datos bien diseñada las consultas van como una moto.
  • Hay que buscar un equilibrio.
  • En tu caso, necesitas un sistema de consulta muy rápido, por eso debes diseñar muy bien los Índices a costa de ralentizar un poco más el proceso de importación.
  • En definitiva, el proceso de importación siempre es lento si los datos van destinados a una base de datos optimizada para las consultas. Es un precio a pagar.

Saludos
Paco Satué