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 JOINveyaUNION ALLile 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
-
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 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
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 kullanılarak yapılan 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, 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
avebsütunları zaten toplanmış olduğundanbsütunu tekrar toplanamaz; bu nedenle 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 ve özgün 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, 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;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 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
-
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, 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
-
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, 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.asütununu içermediğinden yeniden yazma başarısız olur.
JOIN'i 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, 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
-
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, 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
-
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, 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
-
Senaryo
Her ziyaret için sayfa kimliğini, kullanıcı kimliğini ve ziyaret saatini günlüğe kaydeden
visit_recordsadlı 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_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 ifadesi 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 sourcealanı, sorgu tarafından okunan tablonundoc_test_devprojesindekicount_mvolduğ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
Materyalleştirilmiş görünüm işlemleri hakkında daha fazla bilgi için bkz. Materyalleştirilmiş görünüm işlemleri.
Materyalleştirilmiş görünümler için zamanlanmış güncelleme özelliği hakkında daha fazla bilgi için bkz. Materyalleştirilmiş görünümler için zamanlanmış güncellemeler.