Las vistas materializadas almacenan en caché los resultados precalculados de las consultas, pero los cambios en las tablas de origen pueden desactualizarlas. La actualización programada mantiene sincronizada una vista materializada con sus tablas de origen mediante la ejecución automática de tareas de actualización en un intervalo fijo o según una programación Cron.
Funcionamiento
Una actualización programada es una tarea en segundo plano que MaxCompute envía según la programación configurada. El tiempo de finalización depende de los recursos del clúster y del tamaño de la tarea.
Alcance de la actualización
Vistas materializadas particionadas: si cambian los datos en una partición de la tabla de origen particionada que corresponde a las columnas de clave de partición, solo se actualiza la partición asociada de la vista materializada. Si cambian los datos en otras tablas asociadas con la vista materializada, se ejecuta una actualización completa.
Vistas materializadas no particionadas: MaxCompute comprueba si los datos de la tabla de origen han cambiado desde la última actualización. Si no hubo cambios, se omite la actualización.
Gestión de solapamientos
Si una actualización sigue ejecutándose cuando llega la siguiente hora programada, MaxCompute cancela la actualización pendiente y desencadena una nueva en el siguiente horario programado.
Ejemplo con un intervalo de 20 minutos que comienza a las 10:00:00:
|
Scheduled time |
Outcome |
|
|
La actualización comienza y finaliza a las |
|
|
Cancelada (la actualización anterior aún está en curso) |
|
|
La actualización comienza según lo programado |
MaxCompute puede detectar cambios en la configuración de la programación con un retraso de hasta 30 minutos. Una tarea de actualización programada podría enviarse con este retraso después de habilitar o modificar la programación.
Métodos de programación
Existen tres métodos para controlar cuándo se actualiza una vista materializada. Los tres requieren "enable_auto_refresh"="true" en TBLPROPERTIES.
|
Method |
Syntax |
Interval unit |
Best for |
|
Cláusula |
|
Minutos, horas o días |
Intervalos fijos con sintaxis legible |
|
|
|
Solo minutos |
Control a nivel de minuto mediante propiedades de tabla |
|
|
|
Expresión Cron de Quartz |
Programaciones por hora del día o patrones Cron avanzados |
Habilitar la actualización programada
Requisitos previos
Un proyecto de MaxCompute con recursos de cómputo suficientes
Una tabla de origen con datos
En todos los ejemplos se utiliza la siguiente tabla de origen:
CREATE TABLE mf_refresh (id BIGINT, name STRING);
INSERT INTO TABLE mf_refresh VALUES (1,'kyle'),(2,'tom');
Sintaxis completa
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name
[LIFECYCLE days]
[(col_name [COMMENT col_comment], ...)]
[DISABLE REWRITE]
[PARTITIONED BY (col_name [, col_name, ...])]
[CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
[SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
INTO number_of_buckets BUCKETS]
[REFRESH EVERY N MINUTES/HOURS/DAYS]
TBLPROPERTIES("enable_auto_refresh"="true"[, "refresh_interval_minutes"="N"][, "refresh_cron"="expression"])
AS <select_statement>;
|
Parameter |
Description |
|
|
Número de días antes de que expire la vista materializada |
|
|
Deshabilita la reescritura automática de consultas basada en la vista materializada |
|
|
Columnas de clave de partición para vistas materializadas particionadas |
|
|
Atributos de distribución y ordenamiento. Requiere |
|
|
Intervalo fijo de actualización |
|
|
Habilita la actualización programada. Obligatorio para los tres métodos |
|
|
Intervalo de actualización en minutos |
|
|
Expresión Cron de Quartz para programación basada en tiempo. La expresión utiliza 6 o 7 campos (segundos, minutos, horas, día del mes, mes, día de la semana y, opcionalmente, año). No es compatible con el formato estándar de cron Unix de 5 campos. Para más información, consulte Ejemplos de expresiones Cron |
Método 1: cláusula EVERY (recomendado)
Especifique el intervalo de actualización directamente en la instrucción CREATE MATERIALIZED VIEW. La siguiente actualización se ejecuta en el momento de la actualización anterior más el intervalo especificado.
-
Cree una vista materializada que se actualice cada 10 minutos.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh REFRESH EVERY 10 MINUTES TBLPROPERTIES("enable_auto_refresh"="true") AS SELECT id, name FROM mf_refresh; -
Consulte la vista materializada para comprobar los datos iniciales. Salida:
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | +------------+------------+ -
Inserte nuevas filas en la tabla de origen.
INSERT INTO TABLE mf_refresh VALUES (3,'jen'),(4,'cathy'); -
Consulte la vista materializada después de 10 minutos. Las nuevas filas aparecen una vez que finaliza la actualización programada. Salida:
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+
Método 2: refresh_interval_minutes
Establezca el intervalo de actualización en minutos mediante TBLPROPERTIES. La siguiente actualización se ejecuta en el momento de la actualización anterior más el número de minutos especificado.
-
Cree una vista materializada que se actualice cada 20 minutos.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh2 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="20") AS SELECT id, name FROM mf_refresh; -
Consulte la vista materializada para comprobar los datos iniciales. Salida:
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+ -
Inserte nuevas filas en la tabla de origen.
INSERT INTO TABLE mf_refresh VALUES (5,'roger'),(6,'david'); -
Consulte la vista materializada después de 20 minutos. Las nuevas filas aparecen una vez que finaliza la actualización programada. Salida:
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Método 3: refresh_cron
Utilice una expresión Cron de Quartz para definir programaciones basadas en intervalos o en la hora del día. El valor de refresh_cron es una cadena en formato Cron de Quartz.
Ejemplo: actualización cada 5 minutos
-
Cree una vista materializada que se actualice cada 5 minutos.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh3 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="* */5 * * * ? *") AS SELECT id, name FROM mf_refresh; -
Consulte la vista materializada para comprobar los datos iniciales. Salida:
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Inserte nuevas filas en la tabla de origen.
INSERT INTO TABLE mf_refresh VALUES (7,'ethan'),(8,'cal'); -
Consulte la vista materializada después de 5 minutos. Las nuevas filas aparecen una vez que finaliza la actualización programada. Salida:
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Ejemplo: actualización diaria a las 20:00
-
Cree una vista materializada que se actualice a las 20:00 todos los días.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh4 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="0 0 20 * * ? *") AS SELECT id, name FROM mf_refresh; -
Consulte la vista materializada para comprobar los datos iniciales. Salida:
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Inserte nuevas filas en la tabla de origen.
INSERT INTO TABLE mf_refresh VALUES (9,'annie'),(10,'zoe'); -
Consulte la vista materializada después de las 20:00. Las nuevas filas aparecen una vez que finaliza la actualización programada. Salida:
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 9 | annie | | 10 | zoe | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Modificar la programación de actualización
Cambie el intervalo de actualización o cambie a un método de programación diferente con ALTER MATERIALIZED VIEW:
ALTER MATERIALIZED VIEW mf_mv_refresh2 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
ALTER MATERIALIZED VIEW mf_mv_refresh3 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx");
Deshabilitar la actualización programada
Establezca enable_auto_refresh en false:
ALTER MATERIALIZED VIEW mf_mv_refresh SET TBLPROPERTIES("enable_auto_refresh"="false");
Consultar el historial de actualizaciones
Ejecute DESC EXTENDED para consultar el historial de actualizaciones y los detalles de configuración:
DESC EXTENDED mv;
La salida incluye la sección AutoRefresh History con el ID de instancia, el estado, la hora de inicio y la hora de finalización de cada ejecución de actualización:
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$$****@***.aliyunid.com |
| Project: m**** |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2023-05-30 13:16:07 |
| LastDDLTime: 2023-05-30 13:16:07 |
| LastModifiedTime: 2023-05-30 13:16:07 |
+------------------------------------------------------------------------------------+
| MaterializedView: YES |
| ViewText: select id,name from mf_refresh |
| Rewrite Enabled: true |
| AutoRefresh Enabled: true |
| Refresh Interval Minutes: 10 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment |
+------------------------------------------------------------------------------------+
| id | bigint | | | true | NULL | |
| name | string | | | true | NULL | |
+------------------------------------------------------------------------------------+
| Extended Info: |
+------------------------------------------------------------------------------------+
| IsOutdated: false |
| TableID: 569ec712873e44b3868e79b7a8beabab |
| IsArchived: false |
| PhysicalSize: 1875 |
| FileNum: 2 |
| StoredAs: CFile |
| CompressionStrategy: normal |
| odps.timemachine.retention.days: 1 |
| ColdStorageStatus: N/A |
| encryption_enable: false |
+------------------------------------------------------------------------------------+
| AutoRefresh History: |
+------------------------------------------------------------------------------------+
| InstanceId | Status | StartTime | EndTime |
+------------------------------------------------------------------------------------+
| 20230619070546735ghwl1****** | TERMINATED | 2023-06-19 15:05:46 | 2023-06-19 15:05:47 |
| 20230619065545586gwllc****** | TERMINATED | 2023-06-19 14:55:45 | 2023-06-19 14:55:46 |
| 20230619064544463gcjgom****** | TERMINATED | 2023-06-19 14:45:44 | 2023-06-19 14:45:45 |
| 20230619063543334gzxs2d****** | TERMINATED | 2023-06-19 14:35:43 | 2023-06-19 14:35:44 |
| 2023061906254257gi21w2****** | TERMINATED | 2023-06-19 14:25:42 | 2023-06-19 14:25:43 |
| 20230619061540813giacg8****** | TERMINATED | 2023-06-19 14:15:41 | 2023-06-19 14:15:41 |
| 20230619060539674gswjq9****** | TERMINATED | 2023-06-19 14:05:39 | 2023-06-19 14:05:40 |
| 20230619055538578gvdjk****** | TERMINATED | 2023-06-19 13:55:38 | 2023-06-19 13:55:40 |
| 20230619054537356glqdne****** | TERMINATED | 2023-06-19 13:45:37 | 2023-06-19 13:45:38 |
| 2023061905353687gcc5pl****** | TERMINATED | 2023-06-19 13:35:36 | 2023-06-19 13:35:37 |
+------------------------------------------------------------------------------------+
En MaxCompute, TERMINATED significa que la ejecución de la tarea finalizó. Este estado abarca tanto las ejecuciones exitosas como las que presentaron errores. Para más detalles sobre los metadatos de las vistas materializadas, consulte Query information about a materialized view.