Materialized view oluştur ve tazele (refresh)
Oracle
-- FAST refresh için önce kaynak tabloda MV log gerekir:
CREATE MATERIALIZED VIEW LOG ON satislar
WITH ROWID, SEQUENCE (bolge, tutar) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW mv_ciro
BUILD IMMEDIATE REFRESH FAST ON COMMIT
AS SELECT bolge, SUM(tutar) toplam, COUNT(*) adet, COUNT(tutar) tutar_adet
FROM satislar GROUP BY bolge;
-- Elle tazele
EXEC DBMS_MVIEW.REFRESH('MV_CIRO', 'C');REFRESH FAST için materialized view log gerekir; COMPLETE ('C') tam yeniden hesaplar, FAST ('F') artımlıdır. ON COMMIT/ON DEMAND tazeleme zamanını belirler.
PostgreSQL
CREATE MATERIALIZED VIEW mv_ciro AS
SELECT bolge, SUM(tutar) AS toplam FROM satislar GROUP BY bolge;
-- Tazele (CONCURRENTLY için unique index şart)
CREATE UNIQUE INDEX ON mv_ciro (bolge);
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_ciro;REFRESH tümüyle yeniden hesaplar (artımlı değildir). CONCURRENTLY okumaları bloklamaz ama benzersiz index gerektirir ve daha yavaştır.
MySQL
-- MySQL/MariaDB'de yerleşik materialized view yoktur.
-- Yaklaşım: özet tablo + trigger veya zamanlanmış event ile tazeleme
CREATE TABLE mv_ciro (bolge VARCHAR(50) PRIMARY KEY, toplam DECIMAL(18,2));
CREATE EVENT ev_mv_ciro ON SCHEDULE EVERY 1 HOUR DO
REPLACE INTO mv_ciro SELECT bolge, SUM(tutar) FROM satislar GROUP BY bolge;Native materialized view desteği yoktur. Özet (summary) tablo tutulur; trigger'larla anlık ya da EVENT SCHEDULER ile periyodik olarak yeniden doldurulur.
SQL Server
-- Indexed view (materialized view karşılığı)
CREATE VIEW dbo.mv_ciro WITH SCHEMABINDING AS
SELECT bolge, SUM(ISNULL(tutar, 0)) AS toplam, COUNT_BIG(*) AS adet
FROM dbo.satislar GROUP BY bolge;
GO
CREATE UNIQUE CLUSTERED INDEX ix_mv_ciro ON dbo.mv_ciro (bolge);SQL Server'da indexed view kullanılır: WITH SCHEMABINDING zorunlu, unique clustered index oluşturulunca veri fiziksel olarak saklanır ve otomatik güncellenir (ayrı REFRESH gerekmez). GROUP BY varsa COUNT_BIG(*) şarttır; SUM içindeki sütun NULL olabiliyorsa SUM(ISNULL(tutar, 0)) yazılmalıdır (aksi halde 8662 hatası). View QUOTED_IDENTIFIER ve ANSI_NULLS ON iken oluşturulmalıdır. Sorgu iyileştiricinin view'ı otomatik eşleştirmesi yalnızca Enterprise (ve Developer) sürümündedir; Standard'da view'a WITH (NOEXPAND) hint'iyle başvurun.
MongoDB
// On-demand materialized view: $merge ile sonucu koleksiyona yaz
db.satislar.aggregate([
{ $group: { _id: "$bolge", toplam: { $sum: "$tutar" } } },
{ $merge: { into: "mv_ciro", whenMatched: "replace", whenNotMatched: "insert" } }
]);$out veya $merge ile aggregation sonucu kalıcı koleksiyona yazılarak on-demand materialized view elde edilir. Tazeleme için pipeline yeniden çalıştırılır (elle veya zamanlayıcıyla).
Redis
# Uygulanamaz: Redis'te materialized view yoktur. Hesaplanmış sonuç bir anahtara
# yazılıp TTL ile önbelleklenir.
SET mv:ciro:bolge1 12345 EX 3600Materialized view kavramı yoktur; en yakın yaklaşım önceden hesaplanmış değerleri anahtarlarda (String/Hash/Sorted Set) tutmak ve EX/TTL ile süreli önbelleklemektir.
Elasticsearch
# Transform ile sürekli/materyalize edilmiş özet index
PUT _transform/mv_ciro
{ "source": { "index": "satislar" },
"dest": { "index": "mv_ciro" },
"pivot": { "group_by": { "bolge": { "terms": { "field": "bolge" } } },
"aggregations": { "toplam": { "sum": { "field": "tutar" } } } } }
POST _transform/mv_ciro/_startTransform, kaynak index'i pivotlayıp özet bir hedef index'e materyalize eder. Bu örnek batch transform'dur: _start ile bir kez çalışır ve durur. Yeni veriler geldikçe otomatik güncellenen sürekli (continuous) transform için yapılandırmaya bir zaman alanıyla "sync": { "time": { "field": "<zaman_alanı>", "delay": "60s" } } eklenir (continuous: true diye bir ayar yoktur).