Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Eşzamanlı maddileştirilmiş görünüm

Son Güncelleme:Oct 08, 2026

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ı:

Önemli

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_id INT türündedir, bu nedenle to_bitmap() işleviyle sarmalayın ve ardından bitmap_union uygulayı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_id HLL_UNION(HLL_HASH(col)) formatı kullanılırken DECIMAL olamaz.

Ö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_UNION yalnı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_union uygulamadan önce dize sütunlarından bir karma değeri hesaplamak için bitmap_hash veya bitmap_hash64 kullanı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.