2014-09-03 11 views
14

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?

+1

Puoi fornire un esempio di cosa intendi? Pensavo che il punto di vista materializzato fosse mostrare solo una parte dei dati. – Lucas

+0

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

risposta

20

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.

4

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:

  1. Creare un MATERIALIZED VIEW per ogni colonna in questione (material_col1, material_col2, ecc), utilizzando una colonna comune id.
  2. Utilizzare un regolare VIEW (fake_materialized_view) che unisce il MATERIALIZED VIEW s tabelle sulla colonna id
  3. REFRESH MATERIALIZED VIEW come necessario
  4. 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; 
+0

sfortunatamente è utile solo per "colonne partizionate", non per "righe partizionate" (che non sono necessariamente mappate su semplici partizioni definibili e piuttosto su singole righe) –

+0

@AndreasDietrich Suppongo che tu possa fare qualcosa di simile con 'UNION ALL'. .. – n1000

Problemi correlati