Materialized view'ler önceden hesaplanmış sorgu sonuçlarını önbelleğe alır; ancak kaynak tablolardaki değişiklikler bu verilerin güncelliğini yitirmesine neden olabilir. Zamanlanmış yenileme, sabit bir aralıkla veya Cron çizelgesine göre otomatik yenileme görevleri çalıştırarak materialized view'in kaynak tablolarıyla senkronize kalmasını sağlar.
Nasıl çalışır
Zamanlanmış yenileme, MaxCompute tarafından yapılandırdığınız çizelgeye göre arka planda gönderilen bir görevdir. Tamamlanma süresi küme kaynaklarına ve görevin boyutuna bağlıdır.
Yenileme kapsamı
Bölümlendirilmiş materialized view'ler -- Bölüm anahtarı sütunlarına karşılık gelen bölümlendirilmiş kaynak tablonun bir bölümünde veri değişikliği olursa yalnızca materialized view'in ilgili bölümü yenilenir. Materialized view ile ilişkili diğer tablolarda veri değişikliği olursa tam yenileme çalışır.
Bölümlendirilmemiş materialized view'ler -- MaxCompute, son yenilemeden bu yana kaynak tablo verilerinde değişiklik olup olmadığını kontrol eder. Değişiklik yoksa yenileme atlanır.
Çakışma yönetimi
Bir sonraki zamanlanmış saat geldiğinde hala çalışan bir yenileme varsa MaxCompute bekleyen yenilemeyi iptal eder ve bir sonraki zamanlanmış saatinde yeni bir yenileme tetikler.
Saat 10:00:00 itibarıyla 20 dakikalık aralığa sahip örnek:
|
|
|
|
|
|
|
|
|
|
|
|
MaxCompute, çizelge yapılandırması değişikliklerini 30 dakikaya kadar gecikmeyle algılayabilir. Çizelgeyi etkinleştirdiğinizde veya değiştirdiğinizde zamanlanmış yenileme görevi bu gecikmeyle gönderilebilir.
Zamanlama yöntemleri
Bir materialized view'in ne zaman yenileneceğini kontrol eden üç yöntem bulunur. Üç yöntem de TBLPROPERTIES içinde "enable_auto_refresh"="true" ayarını gerektirir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Zamanlanmış yenilemeyi etkinleştirme
Ön koşullar
Yeterli hesaplama kaynağına sahip bir MaxCompute projesi
Veri içeren bir kaynak tablo
Tüm örneklerde aşağıdaki kaynak tablo kullanılır:
CREATE TABLE mf_refresh (id BIGINT, name STRING);
INSERT INTO TABLE mf_refresh VALUES (1,'kyle'),(2,'tom');
Tam sözdizimi
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name
[LIFECYCLE days]
[(col_name [COMMENT col_comment], ...)]
[DISABLE REWRITE]
[PARTITIONED BY (col_name [, col_name, ...])]
[CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...])
[SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])]
INTO number_of_buckets BUCKETS]
[REFRESH EVERY N MINUTES/HOURS/DAYS]
TBLPROPERTIES("enable_auto_refresh"="true"[, "refresh_interval_minutes"="N"][, "refresh_cron"="expression"])
AS <select_statement>;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Yöntem 1: EVERY yan tümcesi (Önerilir)
Yenileme aralığını doğrudan CREATE MATERIALIZED VIEW ifadesinde belirtin. Sonraki yenileme, önceki yenileme zamanına belirtilen aralığın eklenmesiyle çalışır.
-
Her 10 dakikada bir yenilenen bir materialized view oluşturun.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh REFRESH EVERY 10 MINUTES TBLPROPERTIES("enable_auto_refresh"="true") AS SELECT id, name FROM mf_refresh; -
İlk verileri doğrulamak için materialized view'i sorgulayın. Çıktı:
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | +------------+------------+ -
Kaynak tabloya yeni satırlar ekleyin.
INSERT INTO TABLE mf_refresh VALUES (3,'jen'),(4,'cathy'); -
10 dakika sonra materialized view'i sorgulayın. Zamanlanmış yenileme tamamlandıktan sonra yeni satırlar görünür. Çıktı:
SELECT * FROM mf_mv_refresh;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+
Yöntem 2: refresh_interval_minutes
Yenileme aralığını TBLPROPERTIES aracılığıyla dakika cinsinden ayarlayın. Sonraki yenileme, önceki yenileme zamanına belirtilen dakika sayısının eklenmesiyle çalışır.
-
Her 20 dakikada bir yenilenen bir materialized view oluşturun.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh2 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="20") AS SELECT id, name FROM mf_refresh; -
İlk verileri doğrulamak için materialized view'i sorgulayın. Çıktı:
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+ -
Kaynak tabloya yeni satırlar ekleyin.
INSERT INTO TABLE mf_refresh VALUES (5,'roger'),(6,'david'); -
20 dakika sonra materialized view'i sorgulayın. Zamanlanmış yenileme tamamlandıktan sonra yeni satırlar görünür. Çıktı:
SELECT * FROM mf_mv_refresh2;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Yöntem 3: refresh_cron
Aralık tabanlı veya günün saatine göre zamanlamaları tanımlamak için bir Quartz Cron ifadesi kullanın. refresh_cron değeri, Quartz Cron formatında bir dizedir.
Örnek: Her 5 dakikada bir yenileme
-
Her 5 dakikada bir yenilenen bir materialized view oluşturun.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh3 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="* */5 * * * ? *") AS SELECT id, name FROM mf_refresh; -
İlk verileri doğrulamak için materialized view'i sorgulayın. Çıktı:
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Kaynak tabloya yeni satırlar ekleyin.
INSERT INTO TABLE mf_refresh VALUES (7,'ethan'),(8,'cal'); -
5 dakika sonra materialized view'i sorgulayın. Zamanlanmış yenileme tamamlandıktan sonra yeni satırlar görünür. Çıktı:
SELECT * FROM mf_mv_refresh3;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Örnek: Her gün saat 20:00'de yenileme
-
Her gün saat 20:00'de yenilenen bir materialized view oluşturun.
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh4 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="0 0 20 * * ? *") AS SELECT id, name FROM mf_refresh; -
İlk verileri doğrulamak için materialized view'i sorgulayın. Çıktı:
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+ -
Kaynak tabloya yeni satırlar ekleyin.
INSERT INTO TABLE mf_refresh VALUES (9,'annie'),(10,'zoe'); -
Saat 20:00'den sonra materialized view'i sorgulayın. Zamanlanmış yenileme tamamlandıktan sonra yeni satırlar görünür. Çıktı:
SELECT * FROM mf_mv_refresh4;+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 9 | annie | | 10 | zoe | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
Yenileme çizelgesini değiştirme
Yenileme aralığını değiştirmek veya farklı bir zamanlama yöntemine geçmek için ALTER MATERIALIZED VIEW kullanın:
ALTER MATERIALIZED VIEW mf_mv_refresh2 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
ALTER MATERIALIZED VIEW mf_mv_refresh3 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx");
Zamanlanmış yenilemeyi devre dışı bırakma
enable_auto_refresh değerini false olarak ayarlayın:
ALTER MATERIALIZED VIEW mf_mv_refresh SET TBLPROPERTIES("enable_auto_refresh"="false");
Yenileme geçmişini görüntüleme
Yenileme geçmişini ve yapılandırma ayrıntılarını görüntülemek için DESC EXTENDED çalıştırın:
DESC EXTENDED mv;
Çıktı, her yenileme çalıştırması için örnek ID'si, durum, başlangıç zamanı ve bitiş zamanını içeren AutoRefresh History bölümünü içerir:
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$$****@***.aliyunid.com |
| Project: m**** |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2023-05-30 13:16:07 |
| LastDDLTime: 2023-05-30 13:16:07 |
| LastModifiedTime: 2023-05-30 13:16:07 |
+------------------------------------------------------------------------------------+
| MaterializedView: YES |
| ViewText: select id,name from mf_refresh |
| Rewrite Enabled: true |
| AutoRefresh Enabled: true |
| Refresh Interval Minutes: 10 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment |
+------------------------------------------------------------------------------------+
| id | bigint | | | true | NULL | |
| name | string | | | true | NULL | |
+------------------------------------------------------------------------------------+
| Extended Info: |
+------------------------------------------------------------------------------------+
| IsOutdated: false |
| TableID: 569ec712873e44b3868e79b7a8beabab |
| IsArchived: false |
| PhysicalSize: 1875 |
| FileNum: 2 |
| StoredAs: CFile |
| CompressionStrategy: normal |
| odps.timemachine.retention.days: 1 |
| ColdStorageStatus: N/A |
| encryption_enable: false |
+------------------------------------------------------------------------------------+
| AutoRefresh History: |
+------------------------------------------------------------------------------------+
| InstanceId | Status | StartTime | EndTime |
+------------------------------------------------------------------------------------+
| 20230619070546735ghwl1****** | TERMINATED | 2023-06-19 15:05:46 | 2023-06-19 15:05:47 |
| 20230619065545586gwllc****** | TERMINATED | 2023-06-19 14:55:45 | 2023-06-19 14:55:46 |
| 20230619064544463gcjgom****** | TERMINATED | 2023-06-19 14:45:44 | 2023-06-19 14:45:45 |
| 20230619063543334gzxs2d****** | TERMINATED | 2023-06-19 14:35:43 | 2023-06-19 14:35:44 |
| 2023061906254257gi21w2****** | TERMINATED | 2023-06-19 14:25:42 | 2023-06-19 14:25:43 |
| 20230619061540813giacg8****** | TERMINATED | 2023-06-19 14:15:41 | 2023-06-19 14:15:41 |
| 20230619060539674gswjq9****** | TERMINATED | 2023-06-19 14:05:39 | 2023-06-19 14:05:40 |
| 20230619055538578gvdjk****** | TERMINATED | 2023-06-19 13:55:38 | 2023-06-19 13:55:40 |
| 20230619054537356glqdne****** | TERMINATED | 2023-06-19 13:45:37 | 2023-06-19 13:45:38 |
| 2023061905353687gcc5pl****** | TERMINATED | 2023-06-19 13:35:36 | 2023-06-19 13:35:37 |
+------------------------------------------------------------------------------------+
MaxCompute'de TERMINATED durumu, görev yürütmesinin tamamlandığı anlamına gelir. Bu durum hem başarılı hem de başarısız çalıştırmaları kapsar. Materialized view meta verileri hakkında daha fazla bilgi için bkz. Materialized view hakkında bilgi sorgulama.