Actualización de una vista materializada - Amazon Redshift

Actualización de una vista materializada

Cuando crea una vista materializada, su contenido refleja el estado de la tabla o tablas de bases de datos subyacentes en ese momento. Los datos en la vista materializada permanecen sin cambios, incluso cuando las aplicaciones realizan cambios en los datos de las tablas subyacentes. Para actualizar los datos de la vista materializada, puede utilizar la instrucción REFRESH MATERIALIZED VIEW en cualquier momento para actualizar de forma manual las vistas materializadas. Cuando se usa esta instrucción, Amazon Redshift identifica los cambios en la tabla o las tablas base, y los aplica a la vista materializada.

Amazon Redshift tiene dos estrategias para actualizar una vista materializada:

  • En muchos casos, Amazon Redshift puede realizar una actualización progresiva. En una actualización progresiva, Amazon Redshift identifica rápidamente los cambios realizados en los datos de las tablas base desde la última actualización y actualiza los datos en la vista materializada. La actualización progresiva se admite en las siguientes construcciones SQL utilizadas en la consulta a la hora de definir la vista materializada:

    • construcciones que contienen las cláusulas SELECT, FROM, [INNER] JOIN, WHERE, GROUP BY o HAVING

    • construcciones que contienen agregaciones, como SUM, MIN, MAX, AVG y COUNT

    • la mayoría de las funciones SQL integradas, específicamente las que son inmutables, dado que estas tienen los mismos argumentos de entrada y siempre producen la misma salida

    La actualización incremental también es compatible con una vista materializada que se base en una tabla de recurso compartido de datos.

  • Si no es posible realizar una actualización progresiva, entonces Amazon Redshift realiza una actualización completa. Una actualización completa vuelve a ejecutar la instrucción SQL subyacente, sustituyendo todos los datos en la vista materializada.

  • Amazon Redshift elige automáticamente el método de actualización para una vista materializada en función de la consulta SELECT utilizada para definir la vista materializada.

Actualizar una vista materializada en una vista materializada no es un proceso en cascada. En otras palabras, supongamos que tiene una vista materializada A que depende de la vista materializada B. En este caso, cuando se invoca REFRESH MATERIALIZED VIEW A, se actualiza A utilizando la versión actual de B, incluso cuando B no está actualizada. Para que A se actualice completamente, antes de actualizar A, primero actualice B en una transacción independiente.

En el siguiente ejemplo, se muestra cómo crear un plan completo de actualización para una vista materializada mediante programación. Para actualizar la vista materializada v, primero actualice la vista materializada u. Para actualizar la vista materializada w, primero actualice la vista materializada u y, luego, la v.

CREATE TABLE t(a INT); CREATE MATERIALIZED VIEW u AS SELECT * FROM t; CREATE MATERIALIZED VIEW v AS SELECT * FROM u; CREATE MATERIALIZED VIEW w AS SELECT * FROM v; WITH RECURSIVE recursive_deps (mv_tgt, lvl, mv_dep) AS ( SELECT trim(name) as mv_tgt, 0 as lvl, trim(ref_name) as mv_dep FROM stv_mv_deps UNION ALL SELECT R.mv_tgt, R.lvl+1 as lvl, trim(S.ref_name) as mv_dep FROM stv_mv_deps S, recursive_deps R WHERE R.mv_dep = S.name ) SELECT mv_tgt, mv_dep from recursive_deps ORDER BY mv_tgt, lvl DESC; mv_tgt | mv_dep --------+-------- v | u w | u w | v (3 rows)

En el siguiente ejemplo, se muestra un mensaje informativo cuando se ejecuta REFRESH MATERIALIZED VIEW en una vista materializada que depende de una vista materializada que no está actualizada.

create table a(a int);
create materialized view b as select * from a;
create materialized view c as select * from b;
insert into a values (1);
refresh materialized view c; INFO: Materialized view c is already up to date. However, it depends on another materialized view that is not up to date.
REFRESH MATERIALIZED VIEW b; INFO: Materialized view b was incrementally updated successfully.
REFRESH MATERIALIZED VIEW c; INFO: Materialized view c was incrementally updated successfully.

En la actualidad, Amazon Redshift tiene las siguientes limitaciones para la actualización progresiva de vistas materializadas.

Amazon Redshift no admite la actualización progresiva de las vistas materializadas que se definen con una consulta mediante los siguientes elementos SQL:

  • OUTER JOIN (RIGHT, LEFT o FULL).

  • las operaciones de configuración de UNION, INTERSECT, EXCEPT y MINUS

  • Las funciones de agregación MEDIAN, PERCENTILE_CONT, LISTAGG, STDDEV_SAMP, STDDEV_POP, APPROXIMATE COUNT, APPROXIMATE PERCENTILE y las funciones de agregación de cada bit

    nota

    Se admiten las funciones de agregación COUNT, SUM y AVG.

  • Funciones de agregación DISTINCT, como DISTINCT COUNT, DISTINCT SUM, etc.

  • Funciones de ventana.

  • Una consulta que utiliza tablas temporales para la optimización de consultas, como la optimización de subexpresiones comunes.

  • Subconsultas.

  • Tablas externas que hacen referencia a los siguientes formatos de la consulta que definen la vista materializada.

    • Delta Lake

    • Hudi

    La actualización incremental es compatible en la pista de versión preliminar de las vistas materializadas definidas con formatos distintos de los enumerados anteriormente. Para obtener más información sobre la configuración de clústeres de versión preliminar, consulte Crear un clúster de versión preliminar en la Guía de administración de Amazon Redshift. Para obtener información sobre la configuración de grupos de trabajo de versión preliminar, consulte Crear un grupo de trabajo de vista previa en la Guía de administración de Amazon Redshift.

Actualización automática de una vista materializada

Amazon Redshift puede actualizar automáticamente las vistas materializadas con datos actualizados de sus tablas base cuando se crean vistas materializadas con la opción de actualización automática o se modifican para activar dicha opción. Amazon Redshift actualiza automáticamente las vistas materializadas lo antes posible después de que se producen los cambios en las tablas base.

Para completar la actualización de las vistas materializadas más importantes con un impacto mínimo en las cargas de trabajo activas del clúster, Amazon Redshift tiene en cuenta varios factores. Estos factores incluyen la carga del sistema actual, los recursos necesarios para la actualización, los recursos disponibles del clúster y la frecuencia con la que se utilizan las vistas materializadas.

Amazon Redshift prioriza las cargas de trabajo antes que la actualización automática y es posible que detenga la actualización automática para preservar el rendimiento de la carga de trabajo del usuario. Este enfoque podría retrasar la actualización de algunas vistas materializadas. En algunos casos, es posible que necesite un comportamiento de actualización más determinística para las vistas materializadas. En tal caso, considere la posibilidad de utilizar la actualización manual, como se describe en REFRESH MATERIALIZED VIEW, o la actualización programada con las operaciones de la API del programador de Amazon Redshift o la consola.

Puede establecer la actualización automática para las vistas materializadas mediante CREATE MATERIALIZED VIEW. También puede utilizar la cláusula AUTO REFRESH para actualizar las vistas materializadas de forma automática. Para obtener más información acerca de la creación de vistas materializadas, consulte CREATE MATERIALIZED VIEW. Puede activar la actualización automática de una vista materializada actual con ALTER MATERIALIZED VIEW.

Tenga en cuenta lo siguiente cuando actualice las vistas materializadas:

  • Todavía puede actualizar una vista materializada de forma explícita mediante el comando REFRESH MATERIALIZED VIEW, aunque no haya habilitado la actualización automática para la vista materializada.

  • Amazon Redshift no actualiza automáticamente las vistas materializadas que se definen en tablas externas.

  • Para el estado de actualización, puede verificar SVL_MV_REFRESH_STATUS, que registra las consultas iniciadas por el usuario o actualizadas automáticamente.

  • Para ejecutar REFRESH en vistas materializadas solo para volver a calcular, asegúrese de tener el permiso CREATE para los esquemas. Para obtener más información, consulte GRANT.