Pianificazione di una query postgresql che opera su GreenPlum DB
-
21-12-2019 - |
Domanda
Ho una tabella che deve essere popolata ogni ora dai dati estratti da GreenPlum. Questa tabella viene memorizzata sul server GreenPlum.
Allora, ciò che voglio sapere è che quale metodo (script di Python, scheduler di Windows o qualsiasi cosa) sarà adatto ai miei dati (che immagino che possa essere enorme come 60 GB o più) dovrebbe essere utilizzato per la pianificazione della query (scritto in PostgreSQL) da eseguire ogni ora.
Qualcuno può allegare un codice di esempio per lo stesso?
Soluzione
Volete eseguire un COPY
parallelo di gamme dei dati fuori dal GreenPlum e in PostgreSQL. Assicurarsi che PostgreSQL sia impostato per il caricamento rapido dei dati. Se possibile, utilizzare una tabella UNLOGGED
; altrimenti utilizzare almeno wal_level = 'minimal'
.
Quanti lavoratori paralleli dipendono dal sottosistema I / O del server di PostgreSQL più di qualsiasi altra cosa. Testare e vedere.
Consiglierei di utilizzare Python con PsyCopG2 e la funzione del cursore del copy_expert
. Vedi i documenti . Utilizzare Multiprocessing con un tubo per condividere un oggetto simile a un file tra un lettore e un lavoratore scrittore, con il lettore connesso a GreenPlum e lo scrittore a PostgreSQL.
Così efficacemente ogni lavoratore fa qualcosa un po 'come il seguente shell pseudo-code:
psql -h greenplum-box \
-c "COPY (SELECT * FROM mytable WHERE id BETWEEN 1 AND 10000) TO stdin" \
| \
psql -h postgres-box \
-c "COPY myttable FROM stdin";
.
(ma si collega i due utilizzando Pyscopg2, copy_export
, Multiprocessing e un tubo).
Fai tutto il normale lavoro di caricamento rapido come la creazione di indici in seguito. Vedi Come accelerare le prestazioni di inserimento in PostgreSQL .
Se si dispone dello spazio su disco, creare una tabella come dataload_temp
, popolarlo, quindi in una transazione lascia cadere la vecchia e rinomina la nuova al nome del vecchio. In questo modo c'è un'interruzione minima.
In alternativa, dai un'occhiata a pg_bulkload
per il caricamento dei dati off-line (ma non streaming).