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

Re: migliore scelta per aggiornare un database senza rallentare



Buonasera

Il 06/01/16, Leonardo Boselli<leo@dicea.unifi.it> ha scritto:
> Un po'ot ma penso che darà da discutere:
>
> ho un database (mariadb) con una tavola con tanti (circa 30) campi e circa
> 500000 righe.
> Mi interessano tre colonne: EI ET e ED (numerici)
> ogni giorno, alle 3 del mattino, debbo effettuare la seguente operazione:
>    per ogni riga dove ED è diverso da zero e da null :
>       EI=EI+ED ;
>    se dopo la operazione EI è compreso tra +K e -K (costante nota) allora
>       EI=ET; ED=0 ;
> Vincoli: la operazione non deve bloccare l'accesso al database almeno in
> lettura
>   e durare il meno possibile;
> il campo ED diverso da zero e da null dovrebbe essere presente solo in
> circa 7000 record;
>
> Esiste un comando sql che mi possa fare questo (la prima parte è facile,
> con un semplice where ED,
> ma la seconda un po'più difficile visto che dovrebbe scorrere una seconda
> volta il DB.
> Quale è il suggerimento più "efficiente"?
> (oppure è meglio estrarre i record che hanno ED diverso da 0 e da null,
> fare le operazioni da php o perl o anche C e e riscrivere i due valori in
> blocco ? cosa costa meno ?)
> (per inciso: sarebbe anche possibile aggiungere, solo la prima volta, un
> qualcosa che se ED o EI sono null li inizializza a 0 e ET, ma preferirei
> non farlo ...)

UPDATE tabella
SET IF((ED + EI) < K) AND ((ED + EI) > -K), EI = ET, EI = EI + ED),
IF((ED + EI) < K) AND ((ED + EI) > -K), ED = 0, 1 = 1)
WHERE (ED IS NOT NULL) AND (ED != 0)

Non so se funziona.
Se mariadb è prestazionalmente tonto come mysql (non uso qualsiasi
cosa, qualsiasi cosa, mysql, php da due anni, quindi nel frattempo le
cose potrebbero essere cambiate), potresti avere dei vantaggi come
velocità d'esecuzione tirando fuori i valori da php o perl o C,
facendo i calcoli e poi aggiornando i valori in questione.
Se il server rimane bloccato per tanto nel fare 'sta roba, potresti
suddividere le query di scrittura in tranche da 1000 righe per
esempio.


Reply to: