Domanda

Ho un'applicazione che fa carico di massa in un grande tavolo (100 milioni di righe).Sto usando la funzionalità COPY FROM di Postgres per caricare i dati da un file flat.La tabella di destinazione ha una chiave primaria di id.

Per far funzionare l'inserto di massa, ho creato gli ID per ogni riga nel file di caricamento utilizzando:

 SELECT  nextval('apps_id_seq'::regclass)
 FROM    "apps"
 ORDER   BY "apps"."id" ASC
 LIMIT   1 
.

Sfortunatamente, non vedo questa query prendi in eccesso di 150 secondi.Sta causando un sacco di backup, perché alcuni di questi file hanno decine di migliaia di righe in loro.

Eppure quando lo eseguo in linea di comando, ottengo il ritorno in millesimi di un millisecondo.Ecco un explain analyze:

                                                            QUERY PLAN                                                                
------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.57..0.64 rows=1 width=4) (actual time=0.016..0.017 rows=1 loops=1)
   ->  Index Only Scan using apps_pkey on apps  (cost=0.57..15886651.40 rows=228128608 width=4) (actual time=0.015..0.015 rows=1 loops=1)
     Heap Fetches: 0
 Total runtime: 0.030 ms
.

Cosa potrebbe essere che causa il ritardo?Il ritardo è stato riportato dal servizio NewRelic.

È stato utile?

Soluzione

Ho studiato la tua domanda difficile, ma non riesci a dare un senso alla procedura che descrivi.(Potresti lavorare sulla descrizione ancora più.)

Perché darebbe numeri di sequenza a mano, quando puoi semplicemente averli generali automaticamente? per documentazione:

.

Se viene specificato un elenco di colonne, COPY copierà solo i dati nel Colonne specificate da o dal file.Se ci sono delle colonne nel Tabella che non sono nell'elenco delle colonne, COPY FROM inserirà il Valori predefiniti per quelle colonne .

Bold enfasi miniera.Il valore predefinito per un serial colonna è il prossimo ID dalla sua sequenza.

Sei sicuro di non fare un sacco di lavoro ridondante in una moda molto costosa?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top