İçeriğe geç

Materialized View — Pano Her Açılışta Neden Bütün Günü Yeniden Topluyor?

Orta 8 dk Sık karşılaşılır

Önce şunu oku: Pencere Fonksiyonları — Ekstrede Yürüyen Bakiye Nasıl Hesaplanır?

30 saniyede özet

Şube panosu her açılışta günün bütün hareketlerini yeniden toplar. Materialized view sonucu saklar; okumak hızlanır, ama veri son yenileme kadar günceldir. CONCURRENTLY, yenileme sırasında okuyucuları bekletmez.

Uzun bir koşuda biri her baktığında hakem bütün turları baştan sayıyor. Kesin ama yavaş. Bunun yerine saatte bir güncellenen bir tabela asılıyor ve altına güncelleme saati yazılıyor.

  1. Bayt: Şube panosu bugünkü toplamları gösteriyor. Her açılışta günün bütün hareketlerini topluyoruz.

  2. Sen: Sabah dokuzda yirmi müdür aynı anda açtı. Veritabanı aynı hesabı yirmi kez yaptı.

  3. Bayt: Üstelik o toplamın saniyesi saniyesine doğru olmasına gerek yok. Bir saat önceki de iş görür!

  4. Bayt: Bir kez hesaplayıp asalım; altına da saatini yazalım.

Sonucu saklamak

Bir materialized viewBir sorgunun sonucunu tablo gibi saklayan, istendiğinde yenilenen görünüm. Okuması hızlıdır, son yenileme kadar günceldir.Sözlükte gör →, sorgunun sonucunu tablo gibi saklar. Ağır hesap yalnızca yenilemede yapılır; pano, saklanmış küçük sonucu okur.

Bunun bedeli güncelliktir. Son yenilemeden sonra gelen hareketler, bir sonraki yenilemeye kadar görünmez.

Kafam karıştı, daha basit anlat

Sonuç bir kez hesaplanıp saklanır. Okumak hızlıdır, ama son yenileme kadar günceldir.

Hızlı kontrolBaşlangıç

Materialized view nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Sıradan bir view ile materialized view arasındaki fark nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Yenilerken ne olur?

Pano materialized view'dan okuyor. Saat on birde düz REFRESH başladı ve bir dakika sürüyor. 11:01'de bir müdür panoyu açarsa ne görür? Cevabı göster

Hiçbir şey; yenileme bitene kadar bekler. Düz yenileme, view yeniden hesaplanırken okuyucuları kilitler. CONCURRENTLY ile müdür eski sonucu görmeye devam ederdi.

Hızlı okunur, son güncelleme kadar günceldir.
Adım adım oku
  1. Her soran için turları baştan say.
  2. Bir tabela: saatte bir güncellenir.
  3. Boyanırken eski tabela yerinde kalır.
  4. Hızlı okunur, son güncelleme kadar günceldir.

REFRESH CONCURRENTLYMaterialized view'ı, yenileme sırasında okuyucuları bekletmeden yenilemek. View üzerinde benzersiz bir indeks ister.Sözlükte gör →, yenileme sürerken okuyucuların eski sonucu görmesine izin verir. Bunun için view üzerinde benzersiz bir indeks gerekir.

Hangi ekranın materialized view’a uygun olduğuna da bakmak gerekir. Şube toplamları biraz eski olabilir; müşterinin anlık bakiyesi olamaz.

Kafam karıştı, daha basit anlat

CONCURRENTLY yenileme sırasında kimseyi bekletmez. Anlık doğruluk gereken yerde saklanmış sonuç kullanma.

Hızlı kontrolOrta

Panoyu materialized view'dan okumanın bedeli nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Düz REFRESH MATERIALIZED VIEW çalışırken panoyu açan biri ne yaşar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Şube özet panosu

Tohum 230144
  1. 09:00 Müdür panoyu açtı
  2. 10:00 Yeni hareketler geldi
  3. 11:00 Özet yenileniyor
  4. 11:01 Yenileme sürerken pano açıldı
  5. 12:00 Yeni hareketler geldi
  6. 12:30 Müdür panoyu açtı

Toplam iş: 0 blok

Hız
Adım 0

Şu an ne oldu?

Her açılışta toplamı yeniden hesapla

Bir günün olayları sırayla oynuyor.

Görevler0/3

  • Her açılış ağır hesabı baştan yapsınaçık

    İpucu

    Canlı sorgu.

  • Yenileme sırasında pano açılamasınaçık

    İpucu

    Düz REFRESH.

  • Kimse beklemesin ve toplam iş canlı sorgudan az olsunaçık

    İpucu

    Materialized view ve CONCURRENTLY.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Canlı sorgu: üç açılış, üç ağır hesap; hep en güncel toplam.
  2. “Materialized view” seç. Ağır hesap bir kez yapıldı; ama yenileme sırasında açılan pano bekledi.
  3. CONCURRENTLY’yi aç. Kimse beklemedi; iki açılış son yenilemedeki toplamı gösterdi.
Hızlı kontrolOrta

REFRESH MATERIALIZED VIEW CONCURRENTLY için ne gerekir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Panoda materialized view kullanılıyorsa ekranda ne yazmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Güncelleme saatini göstermemek. Saklanmış sonuç ekranda şimdiki gibi görünürse kullanıcı yanılır. Son yenileme zamanını yanına yaz.

Yenilemeyi her kopyada çalıştırmak. Uygulama birkaç kopyada çalışıyorsa, zamanlanmış yenileme her birinde tekrarlanır. Tek bir kopyada çalışması için bir kilit kullan.

Büyüyen veride tam yenileme. PostgreSQL’in materialized view’ı her seferinde baştan hesaplanır. Veri çok büyürse, değişen kısmı güncelleyen bir özet tablosu düşün.

Kafam karıştı, daha basit anlat

Saatini yaz, yenilemeyi tek kopyada çalıştır, büyüyünce özet tablosuna bak.

Hızlı kontrolOrta

Hangi ekran materialized view için uygun değildir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Şube panosu: saklanmış günlük toplamlar 3 dosya · ~56 satır · ilk okumada atlayabilirsin
Proje dosyaları

reports/src/main/resources/db/migration/ V8__branch_daily_totals.sql View: şube başına günlük toplamlar ve yenileme zamanı.

reports/src/main/resources/db/migration/V8__branch_daily_totals.sql
CREATE MATERIALIZED VIEW branch_daily_totals AS
SELECT b.id AS branch_id,
b.name AS branch_name,
t.booked_at::date AS day,
SUM(t.amount) AS total,
COUNT(*) AS transaction_count,
now() AS refreshed_at
FROM transactions t
JOIN accounts a ON a.id = t.account_id
JOIN branches b ON b.id = a.branch_id
GROUP BY b.id, b.name, t.booked_at::date;
-- Required for REFRESH ... CONCURRENTLY.
CREATE UNIQUE INDEX branch_daily_totals_key ON branch_daily_totals (branch_id, day);

reports/src/main/java/com/bank/reports/ BranchTotalsRefresher.java Benzersiz indeks: CONCURRENTLY yenileme için şart.

reports/src/main/java/com/bank/reports/BranchTotalsRefresher.java
@Component
class BranchTotalsRefresher {
private final JdbcTemplate jdbc;
BranchTotalsRefresher(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
@Scheduled(cron = "0 0 * * * *")
@SchedulerLock(name = "branch-totals-refresh", lockAtMostFor = "PT20M")
void refresh() {
// Readers keep seeing the previous result while this runs.
jdbc.execute("REFRESH MATERIALIZED VIEW CONCURRENTLY branch_daily_totals");
}
}

reports/src/main/java/com/bank/reports/ BranchDashboard.java Yenileme işi: saat başı, tek kopyada, okuyucuları bekletmeden.

reports/src/main/java/com/bank/reports/BranchDashboard.java
@Service
class BranchDashboard {
private final JdbcClient jdbc;
BranchDashboard(JdbcClient jdbc) {
this.jdbc = jdbc;
}
record BranchTotal(String branch, BigDecimal total, long count, OffsetDateTime refreshedAt) {}
List<BranchTotal> today() {
return jdbc.sql("""
SELECT branch_name, total, transaction_count, refreshed_at
FROM branch_daily_totals
WHERE day = current_date
ORDER BY total DESC
""")
.query((rs, i) -> new BranchTotal(
rs.getString("branch_name"),
rs.getBigDecimal("total"),
rs.getLong("transaction_count"),
rs.getObject("refreshed_at", OffsetDateTime.class)))
.list();
}
}

Kendini sına

Şimşek turu1/4

Sıradan bir view sorgunun sonucunu saklar.

Soru 1/3İleri

Yenileme her seferinde bütün hesabı baştan yapar. Veri çok büyürse ne düşünülür?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Materialized view bir sorgunun sonucunu tablo gibi saklar. Ağır hesap yalnızca yenilemede yapılır, okumalar hızlıdır.
  2. 2 Saklanmış sonuç son yenileme kadar günceldir. Ekranda son güncelleme zamanı yazmalı; anlık doğruluk gereken yerde kullanılmaz.
  3. 3 Düz yenileme okuyucuları bekletir. REFRESH ... CONCURRENTLY eski sonucu okutmaya devam eder ve benzersiz bir indeks ister.
Sonraki kapı Öğlen biri WHERE yazmadan bir DELETE çalıştırdı. Yedek sunucu da var, gece yedeği de. Hangisi kaç saatlik havaleyi kurtarır? Yedek ve Geri Dönüş — WHERE'siz Bir DELETE Kaç Saatlik Veriyi Götürür? · 8 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı