Hola Javier,

Sólo un pequeño apunte respecto a las variables globales. Aunque las variables globales se crean generalmente con valores por defecto mediante CREATE VARIABLE, cualquier sesión de base de datos puede modificar una variable global mediante SET <variable> = valor, y ese valor sólo existirá para esa sesión y mientras dure ésta. Es por el "scope" de las variables globales:

Session scope: Global variables have a session scope. This means that although they are available to all sessions that are active on the database, their value is private for each sesión.

Te lo comento por si se te ocurre otra forma de solucionar tu problema teniendo esto en cuenta. Por ejemplo, al iniciar la sesión, pedir al usuario que establezca esos dos valores y ponerlos en variables globales, que se mantendrán durante toda su sesión.

Nosotros utilizamos esa técnica creando vistas sencillas sobre tablas complejas (con mucha información de control de históricos y auditoría, por ejemplo), para que devuelvan registros a una fecha concreta, por ejemplo. Cada SELECT sobre una vista de esas, ejecuta internamente una cláusula WHERE definida en la vista que utiliza variable(s) global(es) para filtrar registros, pero cogería el valor que la(s) variable(s) tenga(n) en ese momento para esa sesión.

Salud para todos/as,
Potele

El 02/04/2020 16:08 datil400 <[email protected]> escribió:


Hola a tod@s,

no he sabido expresar de mejor manera la consulta que quiero haceros.

Espero que todos vosotros, vuestros familiares y conocidos estéis bien y viviendo el confinamiento de la mejor manera posible.

Tengo una vista que resume información de varios archivos que contienen millones de registros, no hable de uno o dos millones, hablo de 200 millones. Por muchos índices y consejos del asesor de índices no consigo que se ejecute en un tiempo razonable.

Antes de crear un archivo de acumulados o una tabla materializada que me mantenga siempre calculados los datos quiero probar otras alternativas (si las hay).

En esos 200 millones de registros sólo quiero tratar un grupo reducido, por ejemplo el último mes o el último año. Aunque en el select sobre la vista siempre selecciono el rango que quiero, realmente lo estoy haciendo sobre el resultado de los cálculos que hace la vista, que siempre los hace sobre el total de los registros de las tablas.

Además, son cálculos que se hacer por partes dentro de la cláusula WITH.

Lo que intento es que la vista sólo seleccione el grupo de registros de cada una de las tablas. Un pequeño ejemplo:

WITH
  RESUMEN_TABLA1
AS (
  SELECT * FROM TABLA1 WHERE campo BETWEEN <valor_inicial> AND <valor_final>
),
  RESUMEN_TABLA2
AS (
  SELECT * FROM TABLA2 WHERE campo BETWEEN <valor_inicial> AND <valor_final>
)
SELECT
  *
FROM
  TABLA
LEFT JOIN
  RESUMEN_TABLA1 ON clave1 = clave
LEFT JOIN
  RESUMEN_TABLA2 ON clave2 = clave
;

En la consulta de la vista

SELECT 
  *
FROM
  VISTA
WHERE
  <valor_inicial> = '2020-01-01' AND <valor_final> = '2020-03-31'

Realmente esto no se puede hacer en SQL pero simularlo. Se me ocurren algunas soluciones:

1. Variables globales

Cargar los valores de selección en variables globales que utilice la vista internamente. Inconveniente, dos trabajos o usuarios distintos no podrían hacer una consulta concurrente.

2. Procedimiento almacenado o UDTF

Utilizar el paso de parámetros para seleccionar las filas de los subselects, pero no sé cómo incoporarlas en una vista para que el usuario pueda utilizar un Query, ODBC, etc. sin tener que utilizar el procedimiento o UDTF.

No sé si he sido capaz de explicarme (creo que no), pero ¿alguno vosotros me puede dar alguna pista de cómo podria hacer lo que propongo?

O simplemente estoy alucinando y es imposible hacerlo.

Saludos a todos y gracias por vuestros comentarios.

Javier
____________________________________________________
�nete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 � Publicaciones Help400, S.L.

Logotipo Ayuntamiento Vitoria-Gasteiz
José de la Herran Núñez
Kordinazio Teknikoko Burua
Jefe del Área de Coordinación Técnica

Informazioaren Teknologien Saila
Departamento de Tecnologías de la I nformación

Tel: 945161614 | Fax 945161600
| www.vitoria-gasteiz.org
Logotipo Green Capital

KONFIDENTZIALTASUNA

Komunikazio honen edukia eta honi erantsitako dokumentazio osoarena konfidentziala da eta adierazitako jasotzaileari beste inori ez dagokio.
Zeu jasotzaile ez bazina, jakinaraz iezaguzu, mesedez, eta eskatu nahi dizugu edukiaren berri inori ez esan eta mezua ezaba dezazula.

CONFIDENCIALIDAD

El contenido de esta comunicación, así como el de toda la documentación anexa, es confidencial y va dirigido únicamente al destinatario del mismo.
En el supuesto de que usted no fuera el destinatario, le solicitamos que nos lo in dique y no comunique su contenido a terceros, procediendo a su destrucción.

CONFIDENCIALITY

The content of this communication and any attached information is confidential and exclusively for the use of the addressee.
If you are not the addressee, we ask you to notify to the sender and do not pass its content to another person, and please be sure you destroy it.


____________________________________________________
�nete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 � Publicaciones Help400, S.L.

Reply via email to