Eşzamanlı maddileştirilmiş görünüm, ApsaraDB for SelectDB içinde özel bir tablo olarak depolanan önceden hesaplanmış bir veri kümesidir. Bir SELECT deyimiyle bir kez tanımladığınızda, SelectDB eşleşen bir sorgu geldiğinde otomatik olarak bu görünümden okur; sizin sorguyu yeniden yazmanıza gerek kalmaz.
Eşzamanlı ve eşzamansız maddileştirilmiş görünümler
Oluşturmaya başlamadan önce doğru türü seçin.
| **Eşzamanlı maddileştirilmiş görünüm** | **Eşzamansız maddileştirilmiş görünüm** | |
|---|---|---|
| Temel tablo desteği | Yalnızca tek tablo | Birden çok tablo |
| JOIN desteği | Hayır | Evet |
| Toplama işlevleri | Sınırlı (SUM, MIN, MAX, COUNT, BITMAP_UNION, HLL_UNION) | Tam kapsamlı |
| Sorgu yeniden yazımı | Otomatik | Otomatik |
| Yenileme stratejisi | Eşzamanlı — her veri içe aktarmada güncellenir | Eşzamansız — zamanlanmış veya manuel yenileme |
| Veri tutarlılığı | Temel tabloyla her zaman tutarlı | Nihai tutarlılık |
İş yükünüz tek bir tabloyu hedefliyor ve gerçek zamanlı tutarlılık gerekiyorsa eşzamanlı maddileştirilmiş görünümü kullanın. Çok tablolu JOIN'ler veya daha zengin toplama mantığı için eşzamansız maddileştirilmiş görünümü tercih edin.
Kullanım senaryoları
Toplama hızlandırma: Büyük veri kümeleri üzerinde sıkça çalışan GROUP BY toplamalarını önceden hesaplayın.
Önek dizini eşleştirme: Temel tablonun önek dizinini kullanamayan sorgularla eşleşmesi için farklı bir başlangıç sıralama sütunuyla görünüm oluşturun.
Ön filtreleme: Tarama hacmini azaltmak amacıyla temel tablonun filtrelenmiş bir alt kümesini depolayın.
İfade ön hesaplama: Karmaşık hesaplanan sütunları maddileştirerek sorguların sonuçları doğrudan okumasını sağlayın.
Maddileştirilmiş görünüm ne zaman oluşturulmalı?
Aşağıdaki koşulların tümü geçerli olduğunda eşzamanlı maddileştirilmiş görünüm oluşturun:
Sorgu tek bir tabloyu hedefler.
Sorgu sık çalıştırılır.
Sorgu maliyetlidir (yoğun toplama, büyük tarama veya karmaşık ifade içerir).
Aşağıdaki durumlardan herhangi biri geçerliyse maddileştirilmiş görünüm oluşturmayın:
Sorgu zaten ucuz ve hızlıdır.
Aynı sütun üzerinde farklı toplama işlevleri gerekir (desteklenmez).
Tabloda zaten 10'dan fazla maddileştirilmiş görünüm vardır — her ek görünüm, temel tablo ve tüm görünümleri birlikte güncellendiği için her veri içe aktarma işlemini yavaşlatır.
Sınırlamalar
Doğrudan sorgular desteklenmez. Sorguları temel tablo üzerine yazın. SelectDB en iyi eşleşen maddileştirilmiş görünümü otomatik olarak seçer.
Unique model kısıtlaması: Unique modelinde eşzamanlı maddileştirilmiş görünüm yalnızca sütunları yeniden sıralayabilir; verileri toplayamaz.
İçe aktarma performansı: Her maddileştirilmiş görünüm, her veri içe aktarmaya ek yük getirir. Tek bir tabloda 10'dan fazla maddileştirilmiş görünüm olması içe aktarma işlemlerini önemli ölçüde yavaşlatabilir.
Maddileştirilmiş görünüm oluşturma
Söz dizimi
CREATE MATERIALIZED VIEW <mv_name> AS <query>
[PROPERTIES ("key" = "value")]
query formatı:
SELECT select_expr [, select_expr ...]
FROM <base_table_name>
[GROUP BY column_name [, column_name ...]]
[ORDER BY column_name [, column_name ...]]
Parametreler
| Parametre | Gerekli | Açıklama |
|---|---|---|
mv_name |
Evet | Maddileştirilmiş görünümün adı. Temel tablo başına benzersiz olmalıdır. |
query |
Evet | Maddileştirilmiş görünümü tanımlayan SELECT deyimi. Yalnızca tek bir tabloya başvurmalıdır — alt sorgulara izin verilmez. |
properties |
Hayır | İsteğe bağlı yapılandırma: short_key (sıralama sütunu sayısı) ve timeout (saniye cinsinden oluşturma zaman aşımı). |
SELECT deyimi kısıtlamaları:
Yalnızca tek tablo — alt sorgu yok.
Sütunlar artan değerli sütunlar, sabitler, yinelenen ifadeler veya pencere işlevleri içermemelidir.
SELECT ifadesi bölümleme anahtarı veya kovalama sütunlarını içeriyorsa, bu sütunlar maddileştirilmiş görünümde Anahtar sütunları olmalıdır.
İzin verilen yan tümceler: WHERE, GROUP BY, ORDER BY.
Yasaklanan yan tümceler: JOIN, HAVING, LIMIT, LATERAL VIEW.
Toplama işlevi kısıtlamaları:
Parametreler tek sütunlar olmalıdır — ifadeler desteklenmez. Örneğin, sum(a) geçerlidir ancak sum(a+b) değildir. Aynı sütun üzerinde farklı toplama işlevleri de desteklenmez: SELECT sum(a), min(a) FROM table geçersizdir.
Desteklenen toplama işlevleri:
| İşlev | Kullanım notları |
|---|---|
| SUM, MIN, MAX, COUNT | Standart toplama. |
| BITMAP_UNION | BITMAP_UNION(TO_BITMAP(col)): sütun tam sayı türünde olmalıdır (largeint hariç). BITMAP_UNION(col): temel tablo Aggregate modeli olmalıdır. |
| HLL_UNION | HLL_UNION(HLL_HASH(col)): sütun DECIMAL olamaz. HLL_UNION(col): temel tablo Aggregate modeli olmalıdır. |
ORDER BY otomatik tamamlama kuralları (ORDER BY belirtildiğinde):
Toplama türü görünüm: tüm gruplama sütunları sıralama sütunu olur.
Toplama dışı tür görünüm: sütunların ilk 36 baytı sıralama sütunu olur.
Üçten az sütun otomatik olarak tamamlanırsa ilk üç sütun kullanılır.
GROUP BY belirtilirse ORDER BY gruplama sütunlarıyla eşleşmelidir.
Tasarım ilkeleri
Paylaşılan kalıpları soyutlayın. Maddileştirilmiş görünümü, birden çok sorgunun paylaştığı toplama kalıplarına göre tanımlayın. Yalnızca tek bir sorgu tarafından eşleştirilen bir görünüm, minimal fayda için depolama alanı tüketir.
Yalnızca yaygın boyutları kapsayın. Her boyut kombinasyonu için maddileştirilmiş görünüm gerekmez. Üretim sorgularında en sık görülen kombinasyonları hedefleyin.
Örnekler
Aşağıdaki örneklerde bu temel tablo kullanılmaktadır:
CREATE TABLE duplicate_table (
k1 INT NULL,
k2 INT NULL,
k3 BIGINT NULL,
k4 BIGINT NULL
)
DUPLICATE KEY (k1, k2, k3, k4)
DISTRIBUTED BY HASH(k4) BUCKETS 3;
Örnek 1: Yeniden sıralanmış önekle sütun alt kümesi
CREATE MATERIALIZED VIEW k1_k2 AS
SELECT k2, k1 FROM duplicate_table;
Sonuç: Yalnızca k2 ve k1 içeren, k2 sütununu baştaki sıralama sütunu olarak kullanan bir görünüm. k2 üzerinde filtreleme yapan sorgular, temel tablonun yerine bu görünümün önek dizinini kullanabilir.
Örnek 2: Açık sıralama düzeni
CREATE MATERIALIZED VIEW k2_order AS
SELECT k2, k1 FROM duplicate_table ORDER BY k2;
Örnek 3: Toplama
CREATE MATERIALIZED VIEW k1_k2_sumk3 AS
SELECT k1, k2, sum(k3)
FROM duplicate_table
GROUP BY k1, k2;
Sonuç: k1 ve k2 sütunlarını Anahtar sütunları, sum(k3) değerini ise toplanmış değer olarak içeren bir görünüm. GROUP BY kullanıldığı ve ORDER BY atlandığı için SelectDB k1, k2 sütunlarını sıralama sütunları olarak otomatik tamamlar.
Oluşturma durumunu denetleme
Maddileştirilmiş görünüm oluşturmak eşzamansız bir işlemdir. CREATE deyimini gönderdikten sonra SelectDB arka planda görünümü oluşturur. İlerlemeyi şu komutla izleyin:
SHOW ALTER TABLE MATERIALIZED VIEW FROM <database>;
Sonuç alanları:
| Alan | Açıklama |
|---|---|
TableName |
Temel tablo adı. |
BaseIndexName |
Temel tablo dizini adı. |
RollupIndexName |
Maddileştirilmiş görünüm adı. |
State |
Görev durumu: PENDING (zamanlandı), RUNNING (devam ediyor), FINISHED (tamamlandı), CANCELLED (iptal edildi). |
Timeout |
Saniye cinsinden oluşturma zaman aşımı. |
State değeri FINISHED olduğunda görünüm kullanıma hazırdır.
Örnek:
SHOW ALTER TABLE MATERIALIZED VIEW FROM test_db;
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+
| JobId | TableName | CreateTime | FinishTime | BaseIndexName | RollupIndexName | RollupId | TransactionId | State | Msg | Progress | Timeout |
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+
| 494349 | sales_records | 2020-07-30 20:04:56 | 2020-07-30 20:04:57 | sales_records | store_amt | 494350 | 133107 | FINISHED | | NULL | 2592000 |
+--------+---------------+---------------------+---------------------+---------------+-----------------+----------+---------------+----------+------+----------+---------+
Maddileştirilmiş görünümleri listeleme
Bir temel tablodaki tüm maddileştirilmiş görünümleri şemalarıyla birlikte listeleyin:
DESC <table_name> ALL;
Örnek:
DESC duplicate_table ALL;
+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+
| IndexName | IndexKeysType | Field | Type | InternalType | Null | Key | Default | Extra | Visible | DefineExpr | WhereClause |
+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+
| duplicate_table | DUP_KEYS | k1 | INT | INT | Yes | true | NULL | | true | | |
| | | k2 | INT | INT | Yes | true | NULL | | true | | |
| | | k3 | BIGINT | BIGINT | Yes | true | NULL | | true | | |
| | | k4 | BIGINT | BIGINT | Yes | true | NULL | | true | | |
| | | | | | | | | | | | |
| k2_order | DUP_KEYS | mv_k2 | INT | INT | Yes | true | NULL | | true | `k2` | |
| | | mv_k1 | INT | INT | Yes | false | NULL | NONE | true | `k1` | |
| | | | | | | | | | | | |
| k1_k2 | DUP_KEYS | mv_k2 | INT | INT | Yes | true | NULL | | true | `k2` | |
| | | mv_k1 | INT | INT | Yes | true | NULL | | true | `k1` | |
| | | | | | | | | | | | |
| k1_k2_sumk3 | AGG_KEYS | mv_k1 | INT | INT | Yes | true | NULL | | true | `k1` | |
| | | mv_k2 | INT | INT | Yes | true | NULL | | true | `k2` | |
| | | mva_SUM__`k3` | BIGINT | BIGINT | Yes | false | NULL | SUM | true | `k3` | |
+-----------------+---------------+---------------+--------+--------------+------+-------+---------+-------+---------+------------+-------------+
Oluşturma deyimini görüntüleme
Bir maddileştirilmiş görünümü oluşturmak için kullanılan SQL'i alın:
SHOW CREATE MATERIALIZED VIEW <mv_name> ON <table_name>;
Bu komut yalnızca mevcut maddileştirilmiş görünümler için çalışır. Silinmiş görünümler sorgulanamaz.
Örnek:
SHOW CREATE MATERIALIZED VIEW id_col1 ON table3;
+-----------+----------+----------------------------------------------------------------+
| TableName | ViewName | CreateStmt |
+-----------+----------+----------------------------------------------------------------+
| table3 | id_col1 | create materialized view id_col1 as select id,col1 from table3 |
+-----------+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
Maddileştirilmiş görünüm silme
Devam eden oluşturma işlemini iptal etme
Oluşturma görevi henüz tamamlanmamışsa aşağıdaki komutla iptal edin:
CANCEL ALTER TABLE MATERIALIZED VIEW FROM <database>.<table_name>;
| Parametre | Gerekli | Açıklama |
|---|---|---|
database |
Evet | Temel tabloyu içeren veritabanı. |
table_name |
Evet | Temel tablo adı. |
Örnek:
CANCEL ALTER TABLE MATERIALIZED VIEW FROM test_db.duplicate_table;
Görünüm zaten oluşturulmuşsa bu komutun etkisi olmaz — bunun yerine DROP kullanın.
Tamamlanmış maddileştirilmiş görünümü kaldırma
DROP MATERIALIZED VIEW [IF EXISTS] <mv_name> ON <table_name>;
| Parametre | Gerekli | Açıklama |
|---|---|---|
IF EXISTS |
Hayır | Görünüm yoksa hatayı bastırır. |
mv_name |
Evet | Kaldırılacak maddileştirilmiş görünümün adı. |
table_name |
Evet | Maddileştirilmiş görünümün temel tablosu. |
Örnek:
-- List materialized views before dropping
DESC duplicate_table ALL;
-- Drop the view named k1_k2
DROP MATERIALIZED VIEW k1_k2 ON duplicate_table;
-- Confirm the view is gone
DESC duplicate_table ALL;
Sorgu otomatik eşleştirme
Bir maddileştirilmiş görünüm oluşturulduktan ve State değeri FINISHED olduktan sonra, mevcut tüm sorgular değişmeden temel tabloyu hedeflemeye devam eder. SelectDB en iyi eşleşen maddileştirilmiş görünümü şeffaf bir şekilde seçer ve sorguyu dahili olarak yeniden yazar.
Toplama işlevleri için eşleştirme tablosu şöyledir:
| Maddileştirilmiş görünüm toplamasi | Eşleşen sorgu toplamasi |
|---|---|
| sum | sum |
| min | min |
| max | max |
| count | count |
| bitmap_union | bitmap_union, bitmap_union_count, count(distinct) |
| hll_union | hll_raw_agg, hll_union_agg, ndv, approx_count_distinct |
bitmap veya hll toplama eşleştiğinde, SelectDB maddileştirilmiş görünümün şemasına göre sorgunun toplama operatörünü yeniden yazar.
Bir sorgunun maddileştirilmiş görünüme isabet ettiğini doğrulamak için EXPLAIN komutunu çalıştırın:
EXPLAIN <your_query>;
Çıktıda OlapScanNode düğümünü arayın. rollup özelliği hangi dizinin tarandığını gösterir. Temel tablo adı yerine maddileştirilmiş görünüm adını gösteriyorsa eşleşme onaylanır. EXPLAIN çıktısını okuma hakkında daha fazla bilgi için bkz. Sorgu Explain.
En iyi uygulamalar
BITMAP_UNION ile kesin ayrıntılı sayım
Senaryo: Birden çok boyuta göre gruplandırılmış benzersiz kullanıcıların (veya yüksek kardinaliteli herhangi bir tam sayı sütununun) sayılması.
Tipik sorgu:
SELECT advertiser, channel, COUNT(DISTINCT user_id)
FROM advertiser_view_record
GROUP BY advertiser, channel;
Büyük tablolar üzerinde COUNT(DISTINCT ...) kullanımı maliyetlidir. BITMAP_UNION içeren bir maddileştirilmiş görünüm, verileri önceden tekilleştirerek sorgunun ham satırlar yerine toplanmış bit haritalarını okumasını sağlar.
Görünümü oluşturun:
CREATE MATERIALIZED VIEW advertiser_uv AS
SELECT advertiser, channel, bitmap_union(to_bitmap(user_id))
FROM advertiser_view_record
GROUP BY advertiser, channel;
user_idINT türündedir, bu nedenleto_bitmap()işleviyle sarmalayın ve ardındanbitmap_unionuygulayın. Bu işlem, tam sayıları işlevin gerektirdiği bit haritası biçimine dönüştürür.
Görünüm oluşturulduktan sonra (State = FINISHED), orijinal sorgu otomatik olarak şu şekilde yeniden yazılır:
SELECT advertiser, channel, bitmap_union_count(to_bitmap(user_id))
FROM advertiser_uv
GROUP BY advertiser, channel;
Eşleşmeyi doğrulayın:
EXPLAIN SELECT advertiser, channel, COUNT(DISTINCT user_id)
FROM advertiser_view_record
GROUP BY advertiser, channel;
EXPLAIN çıktısında OlapScanNode düğümünü bulun. rollup değerinin advertiser_uv olduğunu doğrulayın. Ayrıca count(distinct) işleminin bitmap_union_count(to_bitmap) olarak yeniden yazıldığını teyit edin.
HLL_UNION ile yaklaşık ayrıntılı sayım
Senaryo: Kesin hassasiyetin gerekli olmadığı ve sorgu hızının daha önemli olduğu benzersiz sayımların tahmini.
CREATE MATERIALIZED VIEW approx_uv AS
SELECT advertiser, channel, hll_union(hll_hash(user_id))
FROM advertiser_view_record
GROUP BY advertiser, channel;
user_id üzerinde approx_count_distinct, ndv, hll_union_agg veya hll_raw_agg kullanan sorgular bu görünümle otomatik olarak eşleşir.
user_idHLL_UNION(HLL_HASH(col))formatı kullanılırkenDECIMALolamaz.
Önek dizini yeniden sıralama
Senaryo: Sıkça çalıştırılan bir sorgu, temel tablonun sıralama anahtarının baştaki sütunu olmayan bir sütun üzerinde filtreleme yapar.
Temel tablo DUPLICATE KEY (k1, k2, k3, k4) kullanıyor ancak sorgular genellikle k2 üzerinde filtreleme yapıyorsa:
CREATE MATERIALIZED VIEW k2_order AS
SELECT k2, k1 FROM duplicate_table ORDER BY k2;
WHERE k2 = ... içeren sorgular artık bu görünümün önek dizinini kullanarak tarama aralığını önemli ölçüde azaltabilir.
Sorun giderme
Hata: DATA_QUALITY_ERR: "The data quality does not satisfy, please check your data."
Bu hata, veri kalitesi sorunları veya şema değişiklikleri nedeniyle görünüm oluşturma sırasında bellek kullanımının sınırları aşması durumunda oluşur. Neden bellek baskısıysa memory_limitation_per_thread_for_schema_change_bytes parametresini artırın.
Bit haritası görünümlerine özgü iki ek neden:
Kaynak verilerde negatif tam sayılar:
BITMAP_UNIONyalnızca pozitif tam sayıları destekler. Sütun negatif değerler içeriyorsa görünüm oluşturma başarısız olur. Kaynak verileri kontrol edin ve görünümü oluşturmadan önce negatif değerleri filtreleyin veya dönüştürün.Dize sütunları:
bitmap_unionuygulamadan önce dize sütunlarından bir karma değeri hesaplamak içinbitmap_hashveyabitmap_hash64kullanın.
Sonraki adımlar
Sorgu Explain — Sorgu planlamasını hata ayıklamak ve maddileştirilmiş görünüm eşleşmesini doğrulamak için EXPLAIN çıktısını anlayın.