Ho un grande tavolo con 10 m di file. E ho bisogno di ottenere un valore statistico per ogni riga. Ho una funzione che genera questo valore, ad esempio GetStatistic(uuid)
. Questa funzione funziona molto lento e il valore risultato non cambia spesso, quindi ho creato colonna Statistic
nel mio tavolo, e una volta al giorno eseguire query come questa:Postgresql. Può eseguire la query di aggiornamento in paralell?
UPDATE MyTable SET Statistic = GetStatistic(ID);
E nella query di selezione che uso colonna Statistic
senza chiamare GetStatistic
funzioni.
Il problema è che il mio server di produzione ha 64 CPU e molta memoria, quindi quasi tutti i DB possono essere memorizzati nella RAM, ma questa query utilizza solo una CPU e richiede 2 o 3 ore per essere eseguita.
GetStatistic utilizza le tabelle, che sono costanti durante tutta l'esecuzione della query UPDATE. Posso modificare la query per ottenere Postgre per calcolare GetStatistic in parallelo per diverse righe contemporaneamente, utilizzando tutte le CPU disponibili?
Perché utilizzare una funzione, c'è qualcosa che non può essere realizzato da SQL semplice? La funzione richiede solo i valori della riga corrente o coinvolge anche altre fonti di dati (: = tabelle)? BTW: mostraci la funzione. – wildplasser
Controlla il piano di questa query, vedrai che questa funzione è chiamata 10M volte. Forse sarebbe meglio scriverlo in puro SQL e potrebbe essere molto più veloce. –