In Oracle, it is possible to refresh just part of the data. Ma in PostgreSQL, le viste materializzate sono supportate dal 9.3 (la versione attuale ora), che non è così lunga. Quindi mi chiedo: è possibile aggiornare solo una parte dei dati nella vista materializzata in PostgreSQL 9.3? Se sì, come si fa?È possibile aggiornare parzialmente una vista materializzata in PostgreSQL?
risposta
PostgreSQL non supporta ancora gli aggiornamenti progressivi/parziali delle viste materializzate.
9.4 aggiunge REFRESH MATERIALIZED VIEW CONCURRENTLY
ma deve essere rigenerato interamente.
Speriamo di ricevere supporto in 9.5 se qualcuno è abbastanza entusiasta. È possibile farlo solo senza trigger/regole definiti dall'utente per semplici viste materializzate, e sarebbe necessario un supporto speciale per gestire anche cose come l'aggiornamento incrementale di un count(...) ... GROUP BY ...
.
La risposta Oracle a cui si fa riferimento non è in realtà un aggiornamento incrementale. Aggiorna le tue partizioni. Affinché PostgreSQL supporti in modo nativo, dovrebbe prima supportare il partizionamento dichiarativo reale, cosa che non avviene, anche se stiamo discutendo se è possibile farlo per 9.5.
Mi sono appena imbattuto in un problema simile. Imparando da Craig's answer che non è possibile, ho usato una soluzione alternativa. I decostruiti vista materializzata e unito le singole parti in un VIEW
:
- Creare un
MATERIALIZED VIEW
per ogni colonna in questione (material_col1
,material_col2
, ecc), utilizzando una colonna comuneid
. - Utilizzare un regolare
VIEW
(fake_materialized_view
) che unisce ilMATERIALIZED VIEW
s tabelle sulla colonnaid
REFRESH MATERIALIZED VIEW
come necessario- Usa la tua query
fake_materialized_view
invece
Il VIEW
apparirebbe un po 'come questo:
CREATE VIEW fake_materialized_view AS
SELECT m1.id, m1.col1, m2.col2
FROM material_col1 as m1 LEFT JOIN
material_col2 as m2
ON m1.id = m2.id;
sfortunatamente è utile solo per "colonne partizionate", non per "righe partizionate" (che non sono necessariamente mappate su semplici partizioni definibili e piuttosto su singole righe) –
@AndreasDietrich Suppongo che tu possa fare qualcosa di simile con 'UNION ALL'. .. – n1000
Puoi fornire un esempio di cosa intendi? Pensavo che il punto di vista materializzato fosse mostrare solo una parte dei dati. – Lucas
La risposta a cui ti sei collegato per Oracle non è molto convincente. Dice che puoi forzatamente scambiare una delle partizioni per una MV partizionata. Dal momento che il partizionamento in Postgresql non è realmente una funzione incorporata, ma qualcosa che hai fatto da solo, suppongo che potresti avere lo stesso approccio anche su Postgres. – Thilo