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

Re: migliore scelta per aggiornare un database senza rallentare



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


Reply to: