Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Materyalleştirilmiş görünüm sorgu yeniden yazma

Son Güncelleme:Oct 04, 2026

MaxCompute, sorgular filtre koşulları veya belirli operatör türleri içeriyorsa özgün SQL sorgularını bir materyalleştirilmiş görünüm kullanacak şekilde yeniden yazar.

Kullanım notları

  • Materyalleştirilmiş görünüm sorgu yeniden yazmanın temel prensibi, materyalleştirilmiş görünümün sorgu için gereken tüm verileri içermesidir. Buna çıkış sütunları ve filtre koşullarında, toplama işlevlerinde veya JOIN koşullarında kullanılan tüm sütunlar dahildir. Sorgu, materyalleştirilmiş görünümde bulunmayan sütunlara ihtiyaç duyuyorsa veya desteklenmeyen bir toplama işlevi kullanıyorsa yeniden yazılamaz.

  • Materyalleştirilmiş görünüm sorgu yeniden yazmayı etkinleştirmek için sorgu ifadenizden önce aşağıdaki yapılandırmayı ekleyin:

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

    Materyalleştirilmiş görünüm geçersiz durumdaysa sorgu yeniden yazma desteklenmez. Bu durumda sorgu, hızlandırma olmadan doğrudan kaynak tablo üzerinde çalıştırılır.

  • Projeler arası yeniden yazma

    Varsayılan olarak bir MaxCompute projesi, sorgu yeniden yazma işlemi için yalnızca kendi materyalleştirilmiş görünümlerini kullanabilir. Diğer projelerin materyalleştirilmiş görünümlerini kullanmak için sorgunuzdan önce aşağıdaki yapılandırmayı ekleyerek izin verilen MaxCompute projelerinin listesini belirtmeniz gerekir:

    SET odps.sql.materialized.view.source.project.white.list = <project_name1>,<project_name2>,<project_name3>;
  • LEFT/RIGHT JOIN veya UNION ALL ile tanımlanan materyalleştirilmiş görünümleri kullanan yeniden yazmaları etkinleştirmek için sorgu ifadenizden önce aşağıdaki yapılandırmayı ekleyin:

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

Desteklenen operatör türleri

Aşağıdaki tabloda, MaxCompute tarafından desteklenen sorgu yeniden yazma operatörü türleri diğer ürünlerle karşılaştırılmıştır.

Operatör türü

Sınıflandırma

MaxCompute

BigQuery

Amazon Redshift

Hive

FILTER

Tam ifade eşleşmesi

Desteklenir

Desteklenir

Desteklenir

Desteklenir

Kısmi ifade eşleşmesi

Desteklenir

Desteklenir

Desteklenir

Desteklenir

AGGREGATE

Tek AGGREGATE

Desteklenir

Desteklenir

Desteklenir

Desteklenir

Birden fazla AGGREGATE

Desteklenmez

Desteklenmez

Desteklenmez

Desteklenmez

JOIN

JOIN türü

INNER JOIN

Desteklenmez

INNER JOIN

INNER JOIN

Tek JOIN

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

Birden fazla JOIN

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

AGGREGATE+JOIN

-

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

Örnekler

Örnek 1: Filtre koşullarıyla yeniden yazma

  1. Bir materyalleştirilmiş görünüm oluşturun.

    CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5;
  2. Aşağıdaki tabloda materyalleştirilmiş görünüm için yeniden yazma örnekleri verilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

    Materyalleştirilmiş görünüm d sütununu içermediğinden yeniden yazma başarısız olur.

    SELECT d, e FROM src WHERE a=10;

    Materyalleştirilmiş görünüm d ve e sütunlarını içermediğinden yeniden yazma başarısız olur.

    SELECT a, b FROM src WHERE a=1;

    Materyalleştirilmiş görünüm a=1 koşulundaki verileri içermediğinden yeniden yazma başarısız olur.

Örnek 2: Toplama işlevleriyle yeniden yazma

Materyalleştirilmiş görünüm ve sorgu aynı toplama anahtarını paylaşıyorsa tüm toplama işlevleri yeniden yazılabilir. Toplama anahtarları farklıysa yalnızca SUM, MIN ve MAX kullanılarak yapılan yeniden yazmalar desteklenir.

  1. Bir materyalleştirilmiş görünüm oluşturun.

    CREATE MATERIALIZED VIEW mv AS 
    SELECT a, b, sum(c) AS sum, count(d) AS cnt FROM src GROUP BY a, b;
  2. Aşağıdaki tabloda, materyalleştirilmiş görünüme dayalı olarak sorguların nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

    Görünümde a ve b sütunları zaten toplanmış olduğundan b sütunu tekrar toplanamaz; bu nedenle yeniden yazma başarısız olur.

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

    COUNT işlevinin yeniden toplanması desteklenmediğinden yeniden yazma başarısız olur.

Bir toplama işlevi DISTINCT içeriyorsa, sorgu yalnızca materyalleştirilmiş görünüm ve özgün sorgu aynı toplama anahtarına sahipse yeniden yazılabilir. Aksi takdirde yeniden yazma mümkün değildir.

  1. Bir materyalleştirilmiş görünüm oluşturun.

    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. Aşağıdaki tabloda, materyalleştirilmiş görünüme dayalı olarak sorguların nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

    COUNT işlevinin yeniden toplanması desteklenmediğinden yeniden yazma başarısız olur.

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

    a sütunu ek bir toplama gerektirdiğinden yeniden yazma başarısız olur.

Örnek 3: JOIN yan tümcesiyle yeniden yazma

JOIN girişlerini yeniden yazma

  1. Materyalleştirilmiş görünümler oluşturun.

    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. Aşağıdaki tabloda, materyalleştirilmiş görünümlere dayalı olarak sorguların nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

Filtre koşullarıyla JOIN

  1. Materyalleştirilmiş görünümler oluşturun.

    --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. Aşağıdaki tabloda, materyalleştirilmiş görünümlere dayalı olarak sorguların nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

    Materyalleştirilmiş görünüm j2.a sütununu içermediğinden yeniden yazma başarısız olur.

JOIN'i genişletme

  1. Bir materyalleştirilmiş görünüm oluşturun.

    CREATE MATERIALIZED VIEW mv AS SELECT j1.a, j1.b FROM j1 JOIN j2 ON j1.a=j2.a;
  2. Aşağıdaki tabloda, materyalleştirilmiş görünüme dayalı olarak sorguların nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

Bu üç JOIN yeniden yazma senaryosu birleştirilebilir.

Materyalleştirilmiş görünüm sorgu yeniden yazmanın amacı sorguları hızlandırmak olduğundan MaxCompute, en iyi performansı sunan yeniden yazma kurallarına öncelik verir. Kötü hızlandırmaya neden olacak işlemler getiren bir kural uygulanmaz.

Örnek 4: LEFT JOIN yan tümcesiyle yeniden yazma

  1. Bir materyalleştirilmiş görünüm oluşturun.

    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. Aşağıdaki tabloda, materyalleştirilmiş görünüme dayalı olarak bir sorgunun nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

Örnek 5: UNION ALL yan tümcesiyle yeniden yazma

  1. Bir materyalleştirilmiş görünüm oluşturun.

    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. Aşağıdaki tabloda, materyalleştirilmiş görünüme dayalı olarak bir sorgunun nasıl yeniden yazıldığı gösterilmiştir.

    Orijinal sorgu

    Yeniden yazılan sorgu

    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;

Örnek 6: Kullanım durumu

  1. Senaryo

    Her ziyaret için sayfa kimliğini, kullanıcı kimliğini ve ziyaret saatini günlüğe kaydeden visit_records adlı bir sayfa ziyaret tablosu olduğunu varsayalım. Sık yapılan bir analiz görevi, farklı sayfalar için ziyaret sayısını hesaplamaktır.

    Bu durumda, sayfa kimliğine göre gruplayan ve her sayfa için ziyaretleri sayan visit_records üzerinde bir materyalleştirilmiş görünüm oluşturabilirsiniz. Daha sonraki sorguları bu materyalleştirilmiş görünüm üzerinde çalıştırabilirsiniz.

    visit_records yapısı aşağıdaki gibidir:

    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | page_id         | string     |       |                                             |
    | user_id         | string     |       |                                             |
    | visit_time      | string     |       |                                             |
    +------------------------------------------------------------------------------------+
  2. Bir materyalleştirilmiş görünüm oluşturun.

    -- 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. Aşağıdaki sorguyu çalıştırın:

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

    Bu sorgu ifadesi yürütüldüğünde MaxCompute, count_mv materyalleştirilmiş görünümünü otomatik olarak eşleştirir ve önceden toplanmış verileri count_mv üzerinden okur.

  4. Sorgunun materyalleştirilmiş görünüm kullanılarak yeniden yazıldığını doğrulamak için aşağıdaki EXPLAIN komutunu çalıştırın:

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

    Aşağıdaki sonuç döndürülür:

    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

    Döndürülen sonuçtaki Data source alanı, sorgu tarafından okunan tablonun doc_test_dev projesindeki count_mv olduğunu gösterir. Bu durum, materyalleştirilmiş görünümün etkili olduğunu ve sorgu yeniden yazmanın başarılı olduğunu belirtir.

İlgili belgeler