Tüm Ürünler
Search
Belge Merkezi

MaxCompute:CREATE MATERIALIZED VIEW

Son Güncelleme:Oct 04, 2026

Materyalleştirilmiş görünüm senaryoları için verilere dayalı kümeleme veya bölümlemeyi destekleyen bir materyalleştirilmiş görünüm oluşturur.

Genel Bilgiler

Bir görünüm bir sorgu tarafından tanımlanan sanal tablodur. Buna karşılık, materyalleştirilmiş görünüm önceden hesaplanmış sorgu sonuçlarını depolayan ve depolama kaynakları tüketen fiziksel bir tablodur. Faturalama ayrıntıları için bkz. Faturalama kuralları.

Materyalleştirilmiş görünümler aşağıdaki senaryolar için uygundur:

  • Sıkça yürütülen ve sabit bir desene sahip olan sorgular.

  • Toplama ve birleştirme gibi zaman alan işlemler içeren sorgular.

  • Bir tablodaki verilerin yalnızca küçük bir alt kümesine erişen sorgular.

Aşağıdaki tabloda geleneksel sorgular ile materyalleştirilmiş görünüm sorguları karşılaştırılmaktadır.

Öğe

Geleneksel sorgu

Materyalleştirilmiş görünüm sorgusu

Sorgu deyimi

Verileri doğrudan SQL deyimlerini kullanarak sorgularsınız.

SELECT empid, deptname  
FROM emps JOIN depts 
ON emps.deptno=depts.deptno 
WHERE hire_date >= '2018-01-01';

Bir materyalleştirilmiş görünüm oluşturun ve ardından bunu sorgulayın.

Aşağıdaki deyim bir materyalleştirilmiş görünüm oluşturur:

CREATE MATERIALIZED VIEW mv 
    AS SELECT empid, deptname, hire_date  
    FROM emps JOIN depts 
    ON emps.deptno=depts.deptno 
    WHERE hire_date >= '2016-01-01';

Materyalleştirilmiş görünümü sorgulayın:

SELECT empid, deptname FROM mv 
    WHERE hire_date >= '2018-01-01';

Materyalleştirilmiş görünüm için sorgu yeniden yazma etkinleştirildiyse sistem aşağıdaki sorguyu çalıştırdığınızda materyalleştirilmiş görünümü otomatik olarak kullanır:

SELECT empid, deptname 
    FROM emps JOIN depts 
    ON emps.deptno=depts.deptno 
    WHERE hire_date >= '2018-01-01';
    -- This is equivalent to the following statement.
    SELECT empid, deptname FROM mv 
    WHERE hire_date >= '2018-01-01';

Sorgu özellikleri

Sorgu tabloları okur, birleştirmeler gerçekleştirir ve filtreler (WHERE yan tümcesi) uygular. Büyük kaynak tablolar için bu işlemler yavaş olur ve yoğun kaynak gerektirir.

Sorgu materyalleştirilmiş görünümü okur ve filtreler uygular. Birleştirmelere gerek yoktur. MaxCompute sorguyu en uygun materyalleştirilmiş görünümle otomatik olarak eşleştirir ve verileri doğrudan buradan okur; bu da sorgu performansını önemli ölçüde artırır.

Faturalama kuralları

Materyalleştirilmiş görünüm maliyetleri iki bileşenden oluşur:

  • Depolama ücretleri

    Materyalleştirilmiş görünümler fiziksel depolama alanı tüketir ve kullandıkça öde esasına göre depolama ücretlerine neden olur. Daha fazla bilgi için bkz. Depolama fiyatlandırması (kullandıkça öde).

  • Hesaplama maliyetleri

    Materyalleştirilmiş görünüm oluşturma, güncelleme ve sorgulama işlemleri — görünüm geçerli olduğunda sorgu yeniden yazma dahil — hesaplama kaynaklarını tüketir ve hesaplama maliyetlerine neden olur.

    • MaxCompute projeniz abonelik planındaysa ayrı bir ücret tahakkuk etmez.

    • MaxCompute projeniz kullandıkça öde planındaysa MaxCompute maliyetleri SQL karmaşıklığına ve girdi veri hacmine göre hesaplar. Daha fazla bilgi için bkz. Standard SQL fiyatlandırması. Aşağıdaki hususlara dikkat edin:

      • Materyalleştirilmiş görünümü yenilemek için kullanılan SQL deyimi onu tanımlayan sorguyla aynıdır. Proje bir abonelik hesaplama kaynak grubuna bağlıysa işlem ek maliyet olmadan satın aldığınız kaynakları kullanır. Proje kullandıkça öde kaynak grubu kullanıyorsa maliyet girdi veri hacmine ve SQL karmaşıklığına bağlıdır. Yenilemeden sonra depolama ücretleri materyalleştirilmiş görünümün gerçek boyutuna göre tahakkuk eder.

      • Materyalleştirilmiş görünüm geçerli olduğunda sorgu yeniden yazma verileri görünüm üzerinden okur. Girdi veri hacmi kaynak tabloya değil materyalleştirilmiş görünüme bağlıdır. Görünüm geçersizse sorgu yeniden yazma kullanılamaz ve sorgular doğrudan kaynak tabloyu okur. Daha fazla bilgi için bkz. Materyalleştirilmiş görünüm durumunu sorgulama.

      • Materyalleştirilmiş görünüm çoklu tablo birleştirmelerinden oluşturulduğunda veri şişmesi meydana gelebilir. Materyalleştirilmiş görünüm üzerinden okuma işlemi kaynak tablolar üzerinden okumaya kıyasla her zaman maliyeti azaltmaz.

Sınırlamalar

Pencere işlevleri, kullanıcı tanımlı tablo değerli işlevler (UDTF'ler) ve kullanıcı tanımlı skaler işlevler (UDF'ler) ile kullanıcı tanımlı toplama işlevleri (UDAF'ler) gibi deterministik olmayan işlevler desteklenmez.

Not

Deterministik olmayan bir işlev kullanmanız gerekiyorsa şu oturum düzeyindeki özelliği ayarlayın: set odps.sql.materialized.view.support.nondeterministic.function=true;.

Dikkat Edilmesi Gerekenler

  • Materyalleştirilmiş görünüm oluşturmak için temel aldığınız sorgu deyimi yürütülemezse materyalleştirilmiş görünümü oluşturamazsınız.

  • Materyalleştirilmiş görünümdeki bölüm anahtar sütunları bir kaynak tablodan türetilmelidir. Materyalleştirilmiş görünümdeki sütunların sırası ve sayısı kaynak tablodaki sütunların sırası ve sayısı ile aynı olmalıdır. Sütun adları farklı olabilir.

  • Bölüm anahtar sütunları dahil tüm sütunlar için açıklamalar belirtmeniz gerekir. Açıklamaları yalnızca bazı sütunlar için belirtirseniz hata döndürülür.

  • Materyalleştirilmiş görünüm için hem bölümlendirme hem de kümeleme niteliklerini belirtebilirsiniz. Bu durumda her bölümdeki veriler belirtilen kümeleme niteliğine sahip olur.

  • Materyalleştirilmiş görünüm oluşturmak için temel aldığınız sorgu deyimi materyalleştirilmiş görünüm tarafından desteklenmeyen işleçler içeriyorsa hata döndürülür. Materyalleştirilmiş görünümlerin desteklediği işleçler hakkında daha fazla bilgi için bkz. Materyalleştirilmiş görünüme dayalı sorgu yeniden yazma işlemi gerçekleştirme.

  • Varsayılan olarak MaxCompute UDF'ler veya UDAF'ler gibi deterministik olmayan işlevler kullanarak materyalleştirilmiş görünüm oluşturmanıza izin vermez. İş gereksinimleriniz nedeniyle deterministik olmayan işlevler kullanmanız gerekiyorsa set odps.sql.materialized.view.support.nondeterministic.function=true; komutunu oturum düzeyinde çalıştırın.

  • Materyalleştirilmiş görünümün kaynak tablosu boş bir bölüm içeriyorsa materyalleştirilmiş görünümde boş bir bölüm oluşturmak için materyalleştirilmiş görünümü yenileyebilirsiniz.

Söz Dizimi

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name>
[LIFECYCLE <days>]    --Specifies the lifecycle.
[BUILD DEFERRED]    --Creates the schema without populating data.
[(<col_name> [COMMENT <col_comment>], ...)]    --Column comments.
[DISABLE REWRITE]    --Specifies whether the materialized view can be used for query rewrite.
[COMMENT 'table comment']    --Table comment.
[PARTITIONED BY (<col_name> [, <col_name>, ...])]    --Creates the materialized view as a partitioned table.
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...])
  [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])]
    INTO <number_of_buckets> BUCKETS]    --Sets the shuffle and sort properties for a clustered table.
[REFRESH EVERY <num> {MINUTES | HOURS | DAYS}] 
[TBLPROPERTIES("compressionstrategy"="{normal|high|extreme}",    --Specifies the data storage compression strategy for the table.
                "enable_auto_substitute"="true",    --Specifies whether to enable query passthrough to the source table when a partition does not exist.
                "enable_auto_refresh"="true",    --Specifies whether to enable automatic refresh.
                "refresh_interval_minutes"="120",    --Specifies the refresh interval.
                "only_refresh_max_pt"="true"    --For partitioned materialized views, automatically refreshes only the latest partition from the source table.
                )]
AS <select_statement>;

Parametreler

Parametre

Zorunlu

Açıklama

IF NOT EXISTS

Hayır

IF NOT EXISTS belirtmezseniz ve materyalleştirilmiş görünüm zaten varsa işlem hatayla başarısız olur.

project_name

Hayır

Materyalleştirilmiş görünüm için MaxCompute projesinin adı. Bu parametreyi atlarsanız geçerli proje kullanılır.

  1. MaxCompute konsolu üzerinde oturum açın ve sol üst köşeden bir bölge seçin.

  2. Sol gezinme bölmesinde Manage Configurations > Projects seçeneğini belirleyin.

    Proje adınızı görüntüleyin.

mv_name

Evet

Materyalleştirilmiş görünümün adı.

days

Hayır

Materyalleştirilmiş görünümün gün cinsinden yaşam döngüsü. Değer 1 ile 37231 arasında bir tamsayı olmalıdır.

BUILD DEFERRED

Hayır

Belirtilirse materyalleştirilmiş görünümün şemasını verilerle doldurmadan oluşturur.

col_name

Hayır

Materyalleştirilmiş görünümdeki bir sütunun adı.

col_comment

Hayır

Bir sütun için açıklama.

DISABLE REWRITE

Hayır

Materyalleştirilmiş görünüm için sorgu yeniden yazmayı devre dışı bırakır. Varsayılan olarak sorgu yeniden yazma etkindir. Sorgu yeniden yazmayı devre dışı bırakmak için ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE; komutunu ve etkinleştirmek için ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE; komutunu çalıştırabilirsiniz.

PARTITIONED BY

Hayır

Bölüm anahtar sütunları. Bölümlendirilmiş bir materyalleştirilmiş görünüm oluşturmak için bu parametreyi kullanın.

CLUSTERED BY|RANGE CLUSTERED BY

Hayır

Küme lenmiş bir tablo oluşturmaya yönelik karıştırma özelliği.

SORTED BY

Hayır

Küme lenmiş bir tablo oluşturmaya yönelik sıralama özelliği.

REFRESH EVERY

Hayır

Materyalleştirilmiş görünüm için zamanlanan yenileme aralığı. Geçerli birimler MINUTES, HOURS veya DAYS'tir.

number_of_buckets

Hayır

Küme lenmiş bir tablo oluştururken paket sayısı.

TBLPROPERTIES

Hayır

  • compressionstrategy: Veri depolama sıkıştırma stratejisini belirtir. Geçerli değerler normal, high ve extreme'dir. enable_auto_substitute: Bir bölüm mevcut olmadığında kaynak bölümlendirilmiş tabloya sorgu geçişini etkinleştirip etkinleştirmeyeceğinizi belirtir. Daha fazla bilgi için bkz. Materyalleştirilmiş görünüm sorgu yeniden yazma.

  • enable_auto_refresh: İsteğe bağlı. Otomatik veri yenilemeyi etkinleştirmek için bu özelliği true olarak ayarlayın.

  • refresh_interval_minutes: Bu parametre yalnızca enable_auto_refresh true olarak ayarlandığında gereklidir. Dakika cinsinden yenileme aralığını belirtir.

  • only_refresh_max_pt: İsteğe bağlı. Bu özellik yalnızca bölümlendirilmiş materyalleştirilmiş görünümler için geçerlidir. true olarak ayarlanırsa yalnızca kaynak tablodaki en son bölüm yenilenir.

select_statement

Evet

Materyalleştirilmiş görünümü tanımlayan SELECT deyimi. Daha fazla bilgi için bkz. SELECT Söz Dizimi.

Örnekler

Bir materyalleştirilmiş görünüm oluşturma

  1. mf_t ve mf_t1 adlı tablolar oluşturun ve tablolara veri ekleyin.

    CREATE TABLE IF NOT EXISTS mf_t( 
         id     bigint, 
         value   bigint, 
         name   string) 
    PARTITIONED BY (ds STRING); 
    
    ALTER TABLE mf_t ADD PARTITION (ds='1'); 
    INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'),(2,20,'xia'); 
    SELECT * FROM mf_t WHERE ds ='1'; 
    -- The following result is returned.
    +------------+------------+------------+------------+
    | id         | value      | name       | ds         |
    +------------+------------+------------+------------+
    | 1          | 10         | kyle       | 1          |
    | 2          | 20         | xia        | 1          |
    +------------+------------+------------+------------+
    
    CREATE TABLE IF NOT EXISTS mf_t1( 
         id     bigint, 
         value   bigint, 
         name   string) 
    PARTITIONED BY (ds STRING); 
    
    ALTER TABLE mf_t1 ADD PARTITION (ds='1'); 
    INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'),(3,20,'john'); 
    SELECT * FROM mf_t1 WHERE ds ='1';
    -- The following result is returned.
    +------------+------------+------------+------------+
    | id         | value      | name       | ds         |
    +------------+------------+------------+------------+
    | 1          | 10         | kyle       | 1          |
    | 3          | 20         | john       | 1          |
    +------------+------------+------------+------------+
  2. Bir materyalleştirilmiş görünüm oluşturun.

    • Örnek 1: ds adlı bir bölüm anahtar sütunu içeren bir materyalleştirilmiş görünüm oluşturun.

      CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 
      (
        key comment 'unique id',
        value comment 'input value',
        ds comment 'partition'
        )
      PARTITIONED BY (ds)
      AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds
           FROM mf_t AS t1 JOIN mf_t1 AS t2
             ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
      --Query the materialized view.
      SELECT * FROM mf_mv WHERE ds =1;
      +------------+------------+------------+
      | key        | value      | ds         |
      +------------+------------+------------+
      | 1          | 10         | 1          |
      +------------+------------+------------+
    • Örnek 2: Küme lenmiş bölümlendirilmemiş bir materyalleştirilmiş görünüm oluşturun.

      CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 
      CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets 
      AS  SELECT t1.id AS key, t1.value AS value, t1.ds AS ds 
            FROM mf_t AS t1 JOIN mf_t1 AS t2 
              ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
    • Örnek 3: Küme lenmiş bölümlendirilmiş bir materyalleştirilmiş görünüm oluşturun.

      CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 
      PARTITIONED BY (ds) 
      CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets 
      AS  SELECT t1.id AS key, t1.value AS value, t1.ds AS ds 
            FROM mf_t AS t1 JOIN mf_t1 AS t2 
              ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';

Materyalleştirilmiş görünüme dayalı sorgu yeniden yazma uygulama

  1. Senaryo

    Her ziyaret için sayfa kimliğini, kullanıcı kimliğini ve ziyaret saatini kaydeden visit_records adlı bir sayfa ziyaret tablosu düşünün. 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 gruplandıran ve her sayfa için ziyaretleri sayan visit_records üzerinde bir materyalleştirilmiş görünüm oluşturabilirsiniz. Ardından 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 deyimi 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 değeri sorgu tarafından okunan tablonun doc_test_dev projesinin count_mv tablosu 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 gösterir.

Materyalleştirilmiş görünüme dayalı sorgu yeniden yazma işlemi gerçekleştirme

Materyalleştirilmiş görünümlerin en önemli özelliği sorgu deyimlerinde sorgu yeniden yazma işlemleri gerçekleştirmektir. Bir materyalleştirilmiş görünüme dayalı olarak bir sorgu deyimi üzerinde sorgu yeniden yazma işlemleri gerçekleştirmek için sorgu deyiminin önüne set odps.sql.materialized.view.enable.auto.rewriting=true; eklemeniz gerekir. Bir materyalleştirilmiş görünüm geçersizse materyalleştirilmiş görünüm sorgu yeniden yazma işlemleri için kullanılamaz. Bu durumda veriler kaynak tablodan sorgulanır ve sorgu hızı hızlandırılmaz.

Not

Varsayılan olarak bir MaxCompute projesi sorgu yeniden yazma işlemleri için yalnızca kendi materyalleştirilmiş görünümlerini kullanabilir. Diğer MaxCompute projelerinin materyalleştirilmiş görünümlerine dayalı sorgu deyimleri üzerinde sorgu yeniden yazma işlemleri gerçekleştirmeniz gerekiyorsa sorgu deyimlerinden önce set odps.sql.materialized.view.source.project.white.list=<project_name1>,<project_name2>,<project_name3>; ekleyerek MaxCompute projelerini belirtmeniz gerekir.

Aşağıdaki tabloda MaxCompute'in desteklediği sorgu yeniden yazma işleci türleri diğer ürünlerin destekledikleri ile karşılaştırılmaktadır.

İşleç 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 çok AGGREGATE

Desteklenmez

Desteklenmez

Desteklenmez

Desteklenmez

JOIN

JOIN türü

INNER JOIN

Desteklenmez

INNER JOIN

INNER JOIN

Tek JOIN

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

Birden çok JOIN

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

AGGREGATE+JOIN

-

Desteklenir

Desteklenmez

Desteklenir

Desteklenir

Materyalleştirilmiş görünüme dayalı sorgu yeniden yazma işlemleri bir sorgu deyiminin verilerinin materyalleştirilmiş görünüm üzerinden alınmasını gerektirir. Veriler çıktı sütunlarını, filtre işlemleri için gereken sütunları, toplama işlevleri için gereken sütunları ve JOIN işlemleri için gereken sütunları içerir. Sorgu deyimi için gereken sütunlar materyalleştirilmiş görünümde yer almıyorsa veya toplama işlevleri tarafından desteklenmiyorsa materyalleştirilmiş görünüme dayalı sorgu yeniden yazma işlemleri gerçekleştiremezsiniz.

Ö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 sunulmaktadır.

    Orijinal sorgu

    Yeniden yazılmış 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 kullanan 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 sorguların materyalleştirilmiş görünüme dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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üm a ve b sütunlarını zaten topladığından b sütunu tekrar toplanamadığı için 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 ile orijinal 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 sorguların materyalleştirilmiş görünüme dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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 başka 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 sorguların materyalleştirilmiş görünümlere dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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 sorguların materyalleştirilmiş görünümlere dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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 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 sorguların materyalleştirilmiş görünüme dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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 bir sorgunun materyalleştirilmiş görünüme dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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 bir sorgunun materyalleştirilmiş görünüme dayalı olarak nasıl yeniden yazıldığı gösterilmektedir.

    Orijinal sorgu

    Yeniden yazılmış 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;

Materyalleştirilmiş görünüm sorgu geçişi

Bölümlendirilmiş bir materyalleştirilmiş görünüm tüm bölümler için veri içermeyebilir; örneğin yalnızca en son olanları yenilerseniz. Bir sorgu materyalleştirilmiş görünümde verisi olmayan bir bölümü hedeflediğinde sistem otomatik olarak kaynak bölümlendirilmiş tabloya geri döner. Aşağıdaki şekil bu süreci göstermektedir.

查询透穿图示

Materyalleştirilmiş görünüm için geçiş sorgusu özelliğini etkinleştirmek üzere aşağıdaki parametreyi ayarlayın:

Materyalleştirilmiş görünümü oluştururken tblproperties öğesine "enable_auto_substitute"="true" yapılandırmasını ekleyin.

Aşağıdaki örnek geçiş sorgularını destekleyen bir materyalleştirilmiş görünümün nasıl kullanılacağını göstermektedir.

  1. Geçiş sorgularını destekleyen bölümlendirilmiş bir materyalleştirilmiş görünüm oluşturun.

    -- Create a source table named src.
    CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string);
    -- Insert data.
    INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex');
    INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink');
    
    -- Create a partitioned materialized view that supports penetration query.
    CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 
    PARTITIONED BY (dt) 
    tblproperties("enable_auto_substitute"="true") 
    AS SELECT id, name, dt FROM src;
  2. mv materyalleştirilmiş görünümündeki 20210101 bölümünden veri sorgulayın.

    SELECT * FROM mv WHERE dt='20210101';
  3. mv materyalleştirilmiş görünümündeki 20210102 bölümünden veri sorgulayın. Bu bölüm materyalleştirilmediğinden sistem otomatik olarak kaynak tablo üzerinde bir geçiş sorgusu gerçekleştirir.

    SELECT * FROM mv WHERE dt = '20210102';
    -- Because the data for the 20210102 partition is not materialized, the query is rewritten to access the source table. This is equivalent to:
    SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;
  4. mv materyalleştirilmiş görünümündeki bir bölüm aralığından veri sorgulayın. Sistem materyalleştirilmemiş veriler için kaynak tablo üzerinde otomatik olarak bir geçiş sorgusu gerçekleştirir ve sonucu döndürmeden önce materyalleştirilmiş verilerle UNION işlemi kullanarak birleştirir.

    SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id=5; 
    -- Because data for partitions 20201230 and 20210102 is not materialized, the query is rewritten to access the source table. This is equivalent to:
    SELECT * FROM
    (SELECT id, name, dt FROM src WHERE dt='20201230' OR dt='20210102'
     UNION ALL  
     SELECT * FROM mv WHERE dt='20210101'
    ) t WHERE id = 5;

İlgili Deyimler

  • ALTER MATERIALIZED VIEW: bir materyalleştirilmiş görünümü günceller, bir materyalleştirilmiş görünümün yaşam döngüsünü değiştirir, bir materyalleştirilmiş görünüm için yaşam döngüsü özelliğini etkinleştirir veya devre dışı bırakır ya da bir materyalleştirilmiş görünümün bölümlerini siler.

  • DESC TABLE/VIEW: bir MaxCompute projesindeki bir materyalleştirilmiş görünümün bilgilerini görüntüler.

  • SELECT MATERIALIZED VIEW: bir materyalleştirilmiş görünümün durumunu sorgular.

  • DROP MATERIALIZED VIEW: mevcut bir materyalleştirilmiş görünümü siler.