[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: SQL: incrementare valore



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.


Reply to: