Todos los productos
Search
Centro de documentos

MaxCompute:Reescritura de consultas con vistas materializadas

Última actualización: Sep 17, 2026

MaxCompute admite la reescritura de consultas SQL originales para usar una vista materializada cuando las consultas contienen condiciones de filtro o ciertos tipos de operadores.

Notas de uso

  • El principio fundamental de la reescritura de consultas con vistas materializadas es que la vista debe contener todos los datos obligatorios para la consulta. Esto incluye las columnas de salida y cualquier columna utilizada en condiciones de filtro, funciones de agregación o condiciones JOIN. No se puede reescribir una consulta si requiere columnas ausentes en la vista materializada o si utiliza una función de agregación no compatible.

  • Para habilitar la reescritura de consultas con vistas materializadas, agregue a continuación la siguiente configuración antes de su instrucción de consulta:

    SET odps.sql.materialized.view.enable.auto.rewriting=true;

    La reescritura de consultas no es compatible cuando una vista materializada se encuentra en un estado no válido. En este caso, la consulta se ejecuta directamente sobre la tabla de origen sin aceleración.

  • Reescritura entre proyectos

    De forma predeterminada, un proyecto de MaxCompute solo puede usar sus propias vistas materializadas para la reescritura de consultas. Para utilizar vistas materializadas de otros proyectos, especifique una lista de proyectos de MaxCompute permitidos. Agregue a continuación la siguiente configuración antes de su consulta:

    SET odps.sql.materialized.view.source.project.white.list = <project_name1>,<project_name2>,<project_name3>;
  • Para habilitar las reescrituras que usan vistas materializadas definidas con LEFT/RIGHT JOIN o UNION ALL, agregue a continuación la siguiente configuración antes de su instrucción de consulta:

    SET odps.sql.materialized.view.enable.substitute.rewriting=true;

Tipos de operadores compatibles

A continuación se presenta una tabla que compara los tipos de operadores para la reescritura de consultas compatibles con MaxCompute frente a los de otros productos.

Tipo de operador

Clasificación

MaxCompute

BigQuery

Amazon Redshift

Hive

FILTER

Coincidencia completa de expresión

Compatible

Compatible

Compatible

Compatible

Coincidencia parcial de expresión

Compatible

Compatible

Compatible

Compatible

AGGREGATE

AGGREGATE único

Compatible

Compatible

Compatible

Compatible

Varios AGGREGATE

No compatible

No compatible

No compatible

No compatible

JOIN

Tipo de JOIN

INNER JOIN

No compatible

INNER JOIN

INNER JOIN

JOIN único

Compatible

No compatible

Compatible

Compatible

Varios JOIN

Compatible

No compatible

Compatible

Compatible

AGGREGATE+JOIN

-

Compatible

No compatible

Compatible

Compatible

Ejemplos

Ejemplo 1: Reescritura con condiciones de filtro

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. A continuación se muestran ejemplos de reescritura para esta vista materializada.

    Consulta original

    Consulta reescrita

    SELECT a,b FROM src WHERE a>5;
    SELECT a,b FROM mv;
    SELECT a, b FROM src WHERE a=10;
    SELECT a,b FROM mv WHERE a=10;
    SELECT a, b FROM src WHERE a=10 AND b='3';
    SELECT a,b FROM mv WHERE a=10 AND b=3;
    SELECT a, b FROM src WHERE a>3;
    (SELECT a,b FROM src WHERE a>3 AND a<=5) UNION (SELECT a,b FROM mv);
    SELECT a, b FROM src WHERE a=10 AND d=4;

    La reescritura falla porque la vista materializada no contiene la columna d.

    SELECT d, e FROM src WHERE a=10;

    La reescritura falla porque la vista materializada no contiene las columnas d y e.

    SELECT a, b FROM src WHERE a=1;

    La reescritura falla porque la vista materializada no contiene datos donde a=1.

Ejemplo 2: Reescritura con funciones de agregación

Todas las funciones de agregación se pueden reescribir si la vista materializada y la consulta comparten la misma clave de agregación. Si las claves de agregación difieren, solo se admiten las reescrituras que utilizan SUM, MIN y MAX.

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv AS 
    SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;
  2. En la siguiente tabla se muestra cómo se reescriben las consultas a partir de la vista materializada.

    Consulta original

    Consulta reescrita

    SELECT a, sum(c) FROM src GROUP BY a;
    SELECT a, sum(sum) FROM mv GROUP BY a;
    SELECT a, count(d) FROM src GROUP BY a, b;
    SELECT a, cnt FROM mv;
    SELECT a, count(b) FROM 
    (SELECT a, b FROM src GROUP BY a, b) GROUP BY a;
    SELECT a,count(b) FROM mv GROUP BY a;
    SELECT a,count(b) FROM mv GROUP BY a;

    La reescritura falla porque la vista ya tiene agregadas las columnas a y b, por lo que la columna b no se puede agregar de nuevo.

    SELECT a, count(c) FROM src GROUP BY a;

    La reescritura falla porque no se admite la reagregación de la función COUNT.

Si una función de agregación contiene DISTINCT, la consulta solo se puede reescribir cuando la vista materializada y la consulta original tienen la misma clave de agregación. De lo contrario, la reescritura no es posible.

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv AS 
    SELECT a, b, sum(DISTINCT c) AS sum, count(DISTINCT d) AS cnt FROM src GROUP BY a, b;
  2. En la siguiente tabla se muestra cómo se reescriben las consultas a partir de la vista materializada.

    Consulta original

    Consulta reescrita

    SELECT a, count(DISTINCT d) FROM src GROUP BY a, b;
    SELECT a, cnt FROM mv;
    SELECT a, count(c) FROM src GROUP BY a, b;

    La reescritura falla porque no se admite la reagregación de la función COUNT.

    SELECT a, count(DISTINCT c) FROM src GROUP BY a;

    La reescritura falla porque la columna a requiere otra agregación.

Ejemplo 3: Reescritura con una cláusula JOIN

Reescritura de entradas de JOIN

  1. Cree las vistas materializadas.

    CREATE MATERIALIZED VIEW mv1 AS SELECT a, b FROM j1 WHERE b > 10;
    CREATE MATERIALIZED VIEW mv2 AS SELECT a, b FROM j2 WHERE b > 10;
  2. En la siguiente tabla se muestra cómo se reescriben las consultas a partir de las vistas materializadas.

    Consulta original

    Consulta reescrita

    SELECT j1.a,j1.b,j2.a FROM (SELECT a,b FROM j1 WHERE b > 10) j1 JOIN j2 ON j1.a=j2.a;
    SELECT mv1.a, mv1.b, j2.a FROM mv1 JOIN j2 ON mv1.a=j2.a;
    SELECT j1.a,j1.b,j2.a FROM 
    (SELECT a,b FROM j1 WHERE b > 10) j1 
    JOIN (SELECT a,b FROM j2 WHERE b > 10) j2 ON j1.a=j2.a;
    SELECT mv1.a,mv1.b,mv2.a FROM mv1 JOIN mv2 ON mv1.a=mv2.a;

JOIN con condiciones de filtro

  1. Cree las vistas materializadas.

    --Create a non-partitioned materialized view.
    CREATE MATERIALIZED VIEW mv1 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
    CREATE MATERIALIZED VIEW mv2 AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 10;
    --Create a partitioned materialized view.
    CREATE MATERIALIZED VIEW mv LIFECYCLE 7 PARTITIONED BY (ds) AS SELECT t1.id, t1.ds AS ds FROM t1 JOIN t2 ON t1.id = t2.id;
  2. En la siguiente tabla se muestra cómo se reescriben las consultas a partir de las vistas materializadas.

    Consulta original

    Consulta reescrita

    SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a=4;
    SELECT a, b FROM mv1 WHERE a=4;
    SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 20;
    SELECT a,b FROM mv2 WHERE a>20;
    SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5;
    (SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j1.a > 5 AND j1.a <= 10) 
        UNION SELECT * FROM mv2;
    SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds='20210306';
    SELECT key FROM mv WHERE ds='20210306';
    SELECT key FROM t1 JOIN t2 ON t1.id= t2.id WHERE t1.ds>='20210306';
    SELECT key FROM mv WHERE ds>='20210306';
    SELECT j1.a,j1.b FROM j1 JOIN j2 ON j1.a=j2.a WHERE j2.a=4;

    La reescritura falla porque la vista materializada no contiene la columna j2.a.

Extensión de un JOIN

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
  2. En la siguiente tabla se muestra cómo se reescriben las consultas a partir de la vista materializada.

    Consulta original

    Consulta reescrita

    SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j1.a=j3.a;
    SELECT mv.a, mv.b FROM mv JOIN j3 ON mv.a=j3.a;
    SELECT j1.a, j1.b FROM j1 JOIN j2 JOIN j3 ON j1.a=j2.a AND j2.a=j3.a;
    SELECT mv.a,mv.b FROM mv JOIN j3 ON mv.a=j3.a;

Estos tres escenarios de reescritura de JOIN se pueden combinar.

Dado que el objetivo de la reescritura de consultas con vistas materializadas es acelerar las consultas, MaxCompute prioriza las reglas de reescritura que ofrecen el mejor rendimiento. Una regla no se aplica si introduce operaciones que resultarían en una aceleración deficiente.

Ejemplo 4: Reescritura con una cláusula LEFT JOIN

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv LIFECYCLE 7(
            user_id,
            job,
            total_amount
    ) AS SELECT t1.user_id, t1.job, sum(t2.order_amount) AS total_amount 
          FROM user_info AS t1 LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id GROUP BY t1.user_id;
  2. En la siguiente tabla se muestra cómo se reescribe una consulta a partir de la vista materializada.

    Consulta original

    Consulta reescrita

    SELECT t1.user_id, sum(t2.order_amount) AS total_amount 
    FROM user_info AS t1 
    LEFT JOIN sale_order AS t2 ON t1.user_id=t2.user_id 
    GROUP BY t1.user_id;
    SELECT user_id, total_amount FROM mv;

Ejemplo 5: Reescritura con una cláusula UNION ALL

  1. Cree una vista materializada.

    CREATE MATERIALIZED VIEW mv LIFECYCLE 7( 
            user_id, 
            tran_amount, 
            tran_date 
    ) AS SELECT user_id, tran_amount, tran_date FROM alipay_tran UNION ALL 
    SELECT user_id, tran_amount, tran_date FROM unionpay_tran;
  2. En la siguiente tabla se muestra cómo se reescribe una consulta a partir de la vista materializada.

    Consulta original

    Consulta reescrita

    SELECT user_id, tran_amount FROM alipay_tran 
    UNION ALL SELECT user_id, tran_amount FROM unionpay_tran;
    SELECT user_id, tran_amount FROM mv;

Ejemplo 6: Caso de uso

  1. Escenario

    Considere una tabla de visitas a páginas llamada visit_records que registra el identificador de página, el identificador de usuario y la hora de cada visita. Una tarea de análisis frecuente consiste en contar el número de visitas para distintas páginas.

    En esta situación, cree una vista materializada sobre visit_records que agrupe por identificador de página y cuente las visitas de cada una. Después, ejecute las consultas posteriores sobre esta vista materializada.

    La estructura de visit_records es la siguiente:

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. Cree una vista materializada.

    -- Create a materialized view for the visit_records table that groups by page ID and counts the visits for each page.
    
    CREATE MATERIALIZED VIEW count_mv AS SELECT page_id, count(*) FROM visit_records GROUP BY page_id;
  3. Ejecute la siguiente consulta:

    SET odps.sql.materialized.view.enable.auto.rewriting=true; 
    SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    Cuando se ejecuta esta instrucción de consulta, MaxCompute asocia automáticamente la vista materializada count_mv y lee los datos preagregados desde count_mv.

  4. Para comprobar que la consulta se reescribió mediante la vista materializada, ejecute el siguiente comando EXPLAIN:

    EXPLAIN SELECT page_id, count(*) FROM visit_records GROUP BY page_id;

    Se devuelve el siguiente resultado:

    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        Data source: doc_test_dev.count_mv
        TS: doc_test_dev.count_mv
            FS: output: Screen
                schema:
                  page_id (string)
                  _c1 (bigint)
    
    OK

    El campo Data source del resultado devuelto indica que la tabla leída por la consulta es count_mv del proyecto doc_test_dev. Esto confirma que la vista materializada funciona correctamente y que la reescritura de la consulta fue exitosa.

Documentos relacionados