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.

Reply via email to