2015-05-12 9 views
7

Ho scritto una query per aggiornare l'intera tabella. Come posso migliorare questa query per richiedere meno tempo:Come posso ottimizzare questa query PostgreSQL che aggiorna ogni riga?

update page_densities set density = round(density - 0.001, 2) 

Query restituito con successo: 628391 righe interessate, 1754179 ms (29 minuti) tempo di esecuzione.

EDIT: Impostando memoria di lavoro ..

set work_mem = '500MB'; 
update page_densities set density = round(density - 0.001, 2) 

Query restituito con successo: 628391 filari colpite, 731.711 ms (12 minuti) di esecuzione tempo.

+1

Eventuali vincoli coinvolti (in "densità") che potrebbero essere disattivati ​​temporaneamente? Hai provato a eseguire l'aggiornamento in diversi passaggi? – Trinimon

+0

non ci sono vincoli. puoi per favore elaborare come eseguire in più passaggi? –

+0

Ci sono indici sul tavolo? Il tavolo è stato utilizzato da altri utenti contemporaneamente? Il disco rigido su cui è memorizzato il tavolo viene colpito da altre attività? – Gary

risposta

1

Supponendo che la densità non sia un indice, è possibile migliorare le prestazioni con un fattore di riempimento diverso. Vedere questa domanda/risposta o della documentazione di PostgreSQL per ulteriori informazioni:

http://www.postgresql.org/docs/9.4/static/sql-createtable.html

Slow simple update query on PostgreSQL database with 3 million rows

Anche se non è possibile modificare fattore di riempimento di una tabella, è possibile creare una nuova tabella con un diverso fattore di riempimento e copiare i dati al di sopra di. Ecco alcuni esempi di codice.

--create a new table with a different fill factor 
CREATE TABLE page_densities_new 
(
...some fields here 
) 
WITH (
    FILLFACTOR=70 
); 

--copy all of the records into the new table 
insert into page_densities_new select * from page_densities; 

--rename the original/old table 
ALTER TABLE page_densities RENAME TO page_densities_old; 

--rename the new table 
ALTER TABLE page_densities_new RENAME TO page_densities; 

Dopo questo si dispone di una tabella con lo stesso nome e i dati dell'originale, ma ha un fattore di riempimento diverso. L'ho impostato su 70, ma può essere qualsiasi valore compreso tra 10 e 100. (100 è l'impostazione predefinita)