On 29/04/17 14:10, Giuliano Curti wrote: >> UPDATE mee SET r_co = (SELECT max(r_co) FROM mee) + r_to - r_fr WHERE >> r_id =
> la funzione UPDATE itera su tutti i record, la funzione SELECT > nidificata, che anch'essa itera su tutti i record, non risulta > penalizzante? si avrebbe un algoritmo di complessità N**2; Questo vale solo se non hai indici sul DB. La sub-select viene eseguita per prima. Se hai un indice su r_co lo usa, ed essendo gia` ordinato puo` risolversi in una singola lettura o poco piu`. Se non hai l'indice su r_co fa un table scan. Alla fine prende il risultato e lo sostituisce nella query principale. A questo punto se hai un indice su r_id (e visto il nome dovresti averlo) fa un singolo accesso anche nella update, perche` prima prende la riga puntandola direttamente, prende r_to e r_fr, fa il calcolo, la aggiorna e la scrive. > non è possibile memorizzare MAX(r_co) in una variabile temporanea e > poi usarla nel ciclo UPDATE in modo da avere un algoritmo di > complessita N? la domanda deriva dal fatto che non conosco se in SQL è > possibile farlo (in uno script python non avrei dubbi); Se lo fai in python devi lockare la tabella, fare la prima query, calcolare il valore, fare l'update e togliere il lock. Puoi usare una stored procedure che fa lo stesso, ma evita il traffico di rete (e probabilmente la query e` precompilata) eseguendo tutto sul DB. Ma se usi la update con subquery (se il DB le supporta. Non e` scontato) e` automaticamente atomica e non devi preoccuparti di fare il lock a mano. Bye.