On 06/01/2016 18:36, Leonardo Boselli wrote:
ho un database (mariadb) con una tavola con tanti (circa 30) campi e
circa 500000 righe.
non ho mai usato mariadb. Se non erro è un database relazionale derivato
da mysql (anche questo in pratica non l'ho mai usato).
Normalmente 500.000 righe sono di una tabella di medie-piccole dimensioni.
Avere 30 campi sulla stessa tabelle potrebbe non essere ottimale o
potrebbe essere corretto... dipende da che dati sono presenti e che tipo
di database stai usando.
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 ;
perché aggiornare la tabella?
Quello che dici è un'operazione da effettuare con una vista o volendo
con un trigger, ma di solito è meglio usarli il meno possibile. Anche
perché, da quello che dici, il risultato poi lo perdi il giorno dopo.
Se il calcolo lo deve fare solo una volta al giorno e i dati invece
vengono modificati più volte durante la giornata, ma non vuoi il calcolo
real-time, allora è meglio fare una vista materializzata che si aggiorna
alle 3 del mattino. Se mariadb non ha le viste materializzate, allora
puoi usare la vista e la usi per crearti alle 3 del mattino una tabella
relazionata con l'altra che salva il calcolo di EI e ED.
Ho visto che mariadb ha l'istruzione case[1], anche se è molto
semplificata. È sufficiente che ti fai, se non esiste, una funzione per
confrontare due numeri o per sapere se è un numero è in un intervallo
-k, k (es: check_range(num, k) che ritorna 1 se dentro il range e 0 se è
fuori)
nella select ci metti qualcosa del genere per il calcolo di EI
case EI
when 0 then EI
when null then EI
else case check_range(EI+ED,k)
when 1 then ET
else EI+ED
end case
end case
nella select ci metti qualcosa del genere per il calcolo di ED
case EI
when 0 then ED
when null then ED
else case check_range(EI+ED,k)
when 1 then 0
else ED
end case
end case
Vincoli: la operazione non deve bloccare l'accesso al database almeno in
lettura e durare il meno possibile;
vincoli rispettati con vista o vista materializzata
Quale è il suggerimento più "efficiente"?
il più efficiente è usare il db per fare tutto... come ti ho indicato sopra.
Ciao
Davide
[1] https://mariadb.com/kb/en/mariadb/case-statement/
--
Dizionari: http://linguistico.sourceforge.net/wiki
Elenco di software libero: http://tinyurl.com/eddgj
GNU/Linux User: 302090: http://counter.li.org
Non autorizzo la memorizzazione del mio indirizzo su outlook