GH GambleHub

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.
Uyğun deyil:
  • 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ı.
Log/Trace:
  • Теги: `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.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.