Postgres: copia di ampi sottoinsiemi di dati (10k + righe) da uno schema a un altro per uso immediato

postgresql sqlbulkcopy

Domanda

Ho bisogno di inviare righe da uno schema Postgres a un altro su richiesta. Uno schema memorizza il contenuto e l'altro è una copia di un sottoinsieme di dati che l'utente finale aggiungerà, modificherà, cancellerà per il loro uso personale. Ci sono 10 milioni di record e crescono in ciascuna delle tabelle dello schema quando viene aggiunto più contenuto e più contenuto viene assorbito e personalizzato dall'utente finale. Lo spostamento dei dati sarebbe di diverse migliaia di record da più tabelle a più tabelle nell'altro schema. Questi schemi si trovano nello stesso database. Questi dati si spostano continuamente e dovrebbero essere estremamente rapidi, in modo che l'utente finale possa iniziare a personalizzare immediatamente dopo aver scelto il contenuto. Ho esaminato la funzione COPY e anche la replica trigger, ma nessuno sembra eseguire il più rapidamente possibile. Non riesco a rimuovere gli indici prima di inserirli in quanto queste tabelle vengono utilizzate costantemente e in modo pesante dai consumatori. Qualsiasi consiglio sarebbe molto apprezzato.

Risposta accettata

Dal momento che stai copiando da un gruppo di tabelle in uno schema di un database a un altro schema dello stesso database e non puoi iniziare fino a quando il modo più veloce per farlo sarà utilizzando INSERT INTO ... SELECT FROM , esegui come utente che ha accesso a entrambi gli schemi, ad esempio:

INSERT INTO schema2.table_y ( field, field, field )
SELECT field, field, field
FROM schema1.table_y
WHERE user filter condition

Poiché devi eseguire questa operazione su più tabelle, puoi eseguire il wrapping in un'unica grande transazione o eseguire più istruzioni di inserimento utilizzando CTE scrivibili in una query di grandi dimensioni.

Questo sarà davvero il modo più veloce per ottenere una copia dei dati. Tuttavia, richiederà comunque un tempo diverso da zero; entrambe le query SELECT per estrarre i dati richiederanno un po 'di tempo, così come l'inserimento di migliaia di righe su più tabelle. I modi per ridurre questo tempo sono la query generale e l'ottimizzazione delle prestazioni.

Se la manipolazione funziona in modo tale che l'utente non abbia bisogno di una copia dei dati, ma solo un sottoinsieme live dei dati, è possibile esplorare utilizzando VIEW , compresi quelli aggiornabili. Ma sembra che tu abbia bisogno di una copia.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché