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. | 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: Materyalleştirilmiş görünümü sorgulayın: 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: |
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.
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.
|
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 |
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 |
|
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
-
mf_tvemf_t1adlı 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 | +------------+------------+------------+------------+ -
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
-
Senaryo
Her ziyaret için sayfa kimliğini, kullanıcı kimliğini ve ziyaret saatini kaydeden
visit_recordsadlı 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_recordsyapısı aşağıdaki gibidir:+------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | page_id | string | | | | user_id | string | | | | visit_time | string | | | +------------------------------------------------------------------------------------+ -
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; -
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_mvmateryalleştirilmiş görünümünü otomatik olarak eşleştirir ve önceden toplanmış verilericount_mvüzerinden okur. -
Sorgunun materyalleştirilmiş görünüm kullanılarak yeniden yazıldığını doğrulamak için aşağıdaki
EXPLAINkomutunu ç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) OKDöndürülen sonuçtaki
Data sourcedeğeri sorgu tarafından okunan tablonundoc_test_devprojesinincount_mvtablosu 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.
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
-
Bir materyalleştirilmiş görünüm oluşturun.
CREATE MATERIALIZED VIEW mv AS SELECT a,b,c FROM src WHERE a>5; -
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
dsü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
dveesü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=1koş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.
-
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; -
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
avebsütunlarını zaten topladığındanbsütunu tekrar toplanamadığı için yeniden yazma başarısız olur.SELECT a, count(c) FROM src GROUP BY a;COUNTiş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.
-
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; -
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;COUNTişlevinin yeniden toplanması desteklenmediğinden yeniden yazma başarısız olur.SELECT a, count(DISTINCT c) FROM src GROUP BY a;asü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
-
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; -
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
-
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; -
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.asütununu içermediğinden yeniden yazma başarısız olur.
JOIN genişletme
-
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; -
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
-
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; -
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
-
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; -
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.
-
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; -
mvmateryalleştirilmiş görünümündeki20210101bölümünden veri sorgulayın.SELECT * FROM mv WHERE dt='20210101'; -
mvmateryalleştirilmiş görünümündeki20210102bö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; -
mvmateryalleş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ş verilerleUNIONiş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.