Kendi masanızı her zaman "somutlaştırılmış görünüm" olarak uygulayabilirsiniz. Daha önce yapmanız gereken MATERIALIZED VIEW
de bu, Postgres 9.3'te iki şekilde de uygulanıyordu.
Örneğin, bir düz oluşturabilirsiniz VIEW
:
CREATE VIEW graph_avg_view AS
SELECT xaxis, AVG(value) AS avg_val
FROM graph
GROUP BY xaxis;
Ve sonucu bir kez ya da baştan başlamanız gerektiğinde bir bütün olarak gerçekleştirin:
CREATE TABLE graph_avg AS
SELECT * FROM graph_avg_view
(Ya da SELECT
ifadeyi doğrudan oluşturmadan kullanın VIEW
.)
Ardından, kullanım durumunuzun açıklanmayan ayrıntılarına bağlı olarak, DELETE
/ UPDATE
/ INSERT
manüel olarak değişiklik yapabilirsiniz .
Tablonuz için aşağıdaki gibi veri değiştiren CTE'leri içeren temel bir DML deyimi :
Başka hiç kimsenin aynı anda yazmaya çalışmadığını farz etmek graph_avg
(okuma sorun değil):
WITH del AS (
DELETE FROM graph_avg t
WHERE NOT EXISTS (SELECT 1 FROM graph_avg_view v WHERE v.xaxis = v.xaxis);
)
, upd AS (
UPDATE graph_avg t
FROM graph_avg_view v
WHERE t.xaxis = v.xaxis
AND t.avg_val <> v.avg_val
)
INSERT INTO graph_avg t
SELECT *
FROM graph_avg_view v
LEFT JOIN graph_avg t USING (xaxis)
WHERE t.xaxis IS NULL;
Ancak bu büyük olasılıkla optimize edilmelidir.
Temel tarif:
- Temel tablonuza
timestamp
varsayılan now()
olarak bir sütun ekleyin . Hadi diyelim ts
.
- Güncelleştirmeleriniz varsa, geçerli zaman damgasını
xaxis
veya değiştiren her güncellemeyle ayarlamak için bir tetikleyici ekleyin value
.
En son anlık görüntünüzün zaman damgasını hatırlamak için küçük bir tablo oluşturun. Diyelim ki mv
:
CREATE TABLE mv (
tbl text PRIMARY KEY
, ts timestamp NOT NULL DEFAULT '-infinity'
); -- possibly more details
Bu kısmi, çok noktalı virgül dizini oluşturun:
CREATE INDEX graph_mv_latest ON graph (xaxis, value)
WHERE ts >= '-infinity';
Anlık görüntüyü mükemmel dizin kullanımıyla yenilemek için sorgularınızda belirleyici olarak son anlık görüntünün zaman damgasını kullanın .
İşlemin sonunda, dizini bırakın ve '-infinity'
aynı zamanda tablonuza kaydettiğiniz dizin yüklemesindeki (başlangıçta ) zaman damgasını değiştiren işlem zaman damgasıyla yeniden oluşturun . Tek işlemde her şey .
Not kısmi indeks kapağına büyük olduğunu INSERT
ve UPDATE
operasyonların değil DELETE
. Bunu örtbas etmek için tüm masayı düşünmelisin. Hepsi kesin gereksinimlere bağlıdır.