Materiallaşdırılmış təsəvvürlər
Materiallaşdırılmış performans (MV) vaxtaşırı və ya davamlı olaraq yenilənən və sürətli oxunmalar üçün mövcud olan fiziki olaraq qorunan bir sorğu nəticəsidir (aqreqasiya/proyeksiya). Əslində, bunlar «əvvəlcədən hesablanmış» məlumatlardır.
Əsas məqsədlər:- Oxu gecikməsini stabilləşdirin (p95/p99).
- «Isti» ALTP cədvəllərini boşaltın.
- Analitika, API və fich (tövsiyələr, sayğaclar, kataloqlar) üçün proqnozlaşdırıla bilən SLA verin.
1) MV-dən nə vaxt istifadə etmək olar (və nə vaxt - yox)
Uyğun:- Tez-tez təkrarlanan ağır sorğular (join/agg/window) icazə verilən yeniləmə gecikməsi ilə.
- CQRS/məhsul proyeksiyaları: dashbordlar, kataloqlar, sıralanmış siyahılar, sayğaclar.
- Multi-regional oxunmalar: nəticələrin «yerli» surətləri.
- Mantıqsız kompensasiya → daha yaxşı indekslər/OLTP + cache/streaming.
- → MV yazarkən mürəkkəb əməliyyat invariantları əməliyyatları əvəz etmir.
2) MV vs cache vs proyeksiya
Cache: «cavab surəti», proqram səviyyəsində TTL/əlillik tərəfindən idarə olunur; heç bir sxem.
MV: «verilənlərin surəti», SUBD/mühərrik tərəfindən idarə olunur; sxem var, indekslər, əməliyyat refresh.
Proyeksiya (event sourcing/CQRS): hadisələrdən hesablanır; tez-tez masa + artımlı yeniləmə kimi həyata keçirilir (yəni mahiyyətcə «əl MV»).
3) Yeniləmə yolları
3. 1 Paket REFRESH (periodik)
Planlayıcı (cron/skedler): 'REFRESH MATERIALIZED VIEW...'.
Üstünlüklər: sadə, proqnozlaşdırıla bilən, ucuz. Mənfi cəhətləri: pəncərələr köhnəlməlidir.
3. 2 Artımlı refresh
Açar/vaxt pəncərəsi ilə Delta, MV upsert 's.
Dəyişiklik mənbəyi: CDC (Debezium, logical replication), axın (Kafka/Flink/Spark), tetikləyicilər.
Üstünlüklər: kiçik gecikmə və xərc. Mənfi cəhətləri: daha mürəkkəb kod və tutarlılıq.
3. 3 Davamlı (MV axını)
Sütunlu/axınlı DVS-də: materiallaşdırılmış axınlar/cədvəllər (ClickHouse/Kafka, Flink SQL, Materialize, BigQuery MV).
Üstünlüklər: saniyə və aşağı. Mənfi cəhətləri: axın infra və aydın açar/su işarələri tələb edir.
4) Konsistentlik və «təravət»
MV güclü tutarlılığı «atomik» refresh (yeni versiyada read-switch) ilə baş verir.
Daha çox - bounded staleness: «t/pəncərə Δ yaşlı deyil». API/UX müqavilələrində əlaqə saxlayın.
Ödənişlər/ciddi invariantlar üçün CP nüvəsini OLTP-də saxlayın və MV-ni read-plane kimi istifadə edin.
5) Modelləşdirmə və sxem
MV-ni təyinatına görə dar edin: bir tapşırıq - bir MV.
Müvəqqəti açarları (event_time/watermark) və biznes açarlarını (tenant_id, entity_id) saxlayın.
Tez-tez filtr/çeşidləmə üçün indekslər; sütunlu DBB - aqreqatlar/skanlar üçün.
Sürətli refresh və retensiya üçün tarix/tenant/bölgə üzrə partizan.
6) Artımlı yeniləmələr: upsert proyeksiya nümunəsi
1. Dəyişiklik gəlir (CDC/hadisə).
2. MV-sətir (recompute/merge) üçün delta hesab.
3. Açar üzrə 'UPSERT' ('tenant _ id, entity_id, bucket').
4. Təzəlik meta-məlumatlarını yeniləyirik.
İdempotentlik məcburidir: delta təkrarı nəticəni pozmamalıdır.
7) Nümunələr (konseptual)
PostgreSQL (batch refresh)
sql
CREATE MATERIALIZED VIEW mv_sales AS
SELECT date_trunc('day', created_at) AS day,
tenant_id,
SUM(amount) AS revenue,
COUNT() AS orders
FROM orders
GROUP BY 1,2;
-- Быстрые чтения
CREATE INDEX ON mv_sales (tenant_id, day);
-- Без блокировок чтения при обновлении
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_sales;
ClickHouse (streaming MV из Kafka)
sql
CREATE TABLE events_kafka (..., ts DateTime, tenant_id String)
ENGINE = Kafka SETTINGS kafka_broker_list='...',
kafka_topic_list='events',
kafka_format='JSONEachRow';
CREATE MATERIALIZED VIEW mv_agg
ENGINE = AggregatingMergeTree()
PARTITION BY toDate(ts)
ORDER BY (tenant_id, toStartOfMinute(ts)) AS
SELECT tenant_id,
toStartOfMinute(ts) AS bucket,
sumState(amount) AS revenue_state
FROM events_kafka
GROUP BY tenant_id, bucket;
BigQuery MV (avtomatik yeniləmə)
sql
CREATE MATERIALIZED VIEW dataset.mv_top_products
AS SELECT product_id, SUM(amount) AS revenue
FROM dataset.orders
WHERE _PARTITIONDATE BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) AND CURRENT_DATE()
GROUP BY product_id;
8) Interfeyslərdə/müqavilələrdə təravət
Qaytarın 'X-Data-Freshness: <seconds> '/' as _ of' sahəsi.
Kritik ekranlar üçün - «yeniləmə düyməsi» və nişan «N geri yeniləndi».
API-də SLO təravətini göstərin (məsələn, p95 ≤ 60 s).
9) Multi-tenant və regionlar
MV-də 'tenant _ id' açarı tələb olunur.
Fairness: kirayəçilər üçün refresh/axın kvotaları; gecə per tenant böyük MV şedulinq.
Residency: MV ilkin məlumatlarla eyni bölgədə yaşayır; cross-region - yalnız aqreqatlar.
10) Müşahidə
Metriklər:- `freshness_age_ms` (p50/p95/p99), `refresh_latency_ms`, `rows_processed/s`, `refresh_errors`.
- MV/partiyalar ölçüsü, saxlama xərcləri.
- Axın üçün: lag konnektor, «su» (watermark), late events payı.
- Теги: `mv_name`, `tenant_id`, `partition`, `refresh_id`, `delta_size`.
- Səbəblərə görə «yenidən hesablamalar» və feyllər haqqında hesabatlar (schema mismatch, timeout).
11) Test və xaos
Correctness: MV vs alt seçki mənbəyi müqayisə; nəzarət məbləğləri.
Freshness under load: qeyd yük + SLO təravət zəmanət.
Schema evolution: sahələrin əlavə edilməsi/adının dəyişdirilməsi, CDC konnektorunun «düşməsi».
Late/Out-of-order: hadisələrin repleyləri, su işarələrinin dəyişdirilməsi.
İdempotentlik: delta/batch yenidən çatdırılması.
12) Retenshn və dəyəri
Yalnız istədiyiniz pəncərələri saxlayın (məsələn, 90 gün); köhnə partiyalar arxiv.
müntəzəm vakuum/merj (motor).
MV-ni "universal canavar 'dan qaçaraq xüsusi API/səhifələrin altına salın.
13) Təhlükəsizlik və uyğunluq
Mənbədən giriş siyasətlərini (RLS/ACL) miras edin - MV-ni mənbə cədvəllərindən daha geniş paylamayın.
Xüsusilə analitika/log üçün MV qurarkən PII maskalamaq.
Refresh/redrayv auditi.
14) Tipik səhvlər
«Hər şey üçün bir böyük MV» → bahalı refresh və zəif izolyasiya.
Indekslərin/partiyaların olmaması → p99 atlayır, refresh klasteri boğur.
Deltaların əvəzinə tam yenidən hesablanması.
API/UX → istifadəçilərin «köhnəlmiş» məlumatlara iddiaları.
schema evolution/CDC səhvlər məhəl → uyğunluq itkisi.
MV əməliyyatları ilə əvəz etmək cəhdi: MV - oxu haqqında, ciddi yazma əməliyyatları haqqında deyil.
15) Sürətli reseptlər
Dashboard Product: MV dəqiqə/saat baket, refresh cədvəli + VIP üçün on-demand, p95 təravət ≤ 60 s.
Kataloq/axtarış: CDC-dən (upsert) inkremental proyeksiya, filtr indeksləri, lag ≤ 5-15 s.
Maliyyə hesabatı: «REFRESH CONCURRENTLY» atom ilə paket MV, nəzarət məbləğləri, cavablarda «as_of».
Qlobal SaaS: regional MV, kross-regional asenkron aqreqasiya.
16) Satış öncəsi yoxlama siyahısı
- SLA təravəti (Δt/p95) müəyyən və API/UX-də əks olunur.
- Seçilmiş rejimi: batch refresh/artımlı/streaming; mənbələr təsvir (CDC/hadisələr).
- MV «tapşırıq» nəzərdə tutulmuşdur, indekslər və hissələr var, saxlama pəncərə ilə məhdudlaşır.
- Upsert/aqreqatların idempotentliyi testlərlə təsdiqlənir; late/out-of-order emalı.
- Müşahidə: təzəlik/lag metriklər, alertlər, refresh treysinq.
- Playbook: partisionun yenidən hesablanması, konnektorun nasazlığından sonra redrave, sxemin təkamülü.
- Giriş və PII mənbəyə uyğundur; audit daxildir.
- Nəzarət altında qiymət: retenshn, sıxılma, pəncərə vaxtı refresh.
- Sənədləşmə: MV-də «həqiqət», törəmə təbəqə, biznes gözləntiləri.
Nəticə
Materiallaşdırılmış təsəvvürlər - oxu sürəti ilə aktuallıq arasında mühəndislik güzəştidir. Aydın SLA təravəti, düzgün sxem, inkremental yeniləmə və normal telemetriya ilə MV ağır istəkləri proqnozlaşdırıla bilən millisaniyələrə çevirir - etibarlılıq və xərclərə nəzarət olmadan.