none
Migliore tecnica per SUM con migliaia di righe RRS feed

  • Domanda

  • Ciao, ho un dubbio da risolvere relativo alla modalità da seguire per un caso.

    Premetto che non sono esperto di MSSQL o SQL e quindi non conosco nel dettaglio magari funzioni che potrebbero essermi utili (nello specifico utilizzo SQL2008 R2).

    Ho una due tabelle in relazione uno a molti.

    Devo eseguire una serie di operazioni matematiche (solo somme o sottrazioni) utilizzando sia dei valori presenti nella tabella padre, che valori presenti nella figlia. Le operazioni prevedono di utilizzare la somma totale di alcuni campi nella tabella figlia e mai l'utilizzo delle singole righe.

    Normalmente, avrei semplicemente lasciato i dati univoci nelle tabelle, e all'occorrenza avrei eseguito la somma del/dei un campo/i necessari.

    Mi sto però ponendo il problema che con il tempo, la tabella figlia andrà a contenere molte righe (centiania di migliaia o maggiori con il passare degli anni, non posso prevederlo...)  e mi sorce il dubbio che a questo punto le prestazioni degraderanno sempre di più (ma non ho mai provato nella realtà).

    Una soluzione potrebbe essere quella di mettere ad esempio un trigger che per ogni inserimento o variazione di una riga nella tabella figlia, vada a modificare un campo somma nella tabella padre per aggiornarlo con la nuova quantità.

    In questo modo quando dovrò fare le varie operazioni andrò ad utilizzare solo il campo già sommato precedentemente, senza dover rileggere tutte le righe.

    ...però è una soluzione che non mi piace molto... ed inoltre inevitabilmente con il tempo, mi porterà ad avere imprecisioni.

    Secondo voi potrebbe essere comunque la sola soluzione migliore? Seguireste altre strade?

    Grazie. Luca


    • Modificato lmvideo giovedì 13 ottobre 2011 07:43
    giovedì 13 ottobre 2011 07:29

Tutte le risposte

  • Devo eseguire una serie di operazioni matematiche (solo somme o sottrazioni) utilizzando sia dei valori presenti nella tabella padre, che valori presenti nella figlia. Le operazioni prevedono di utilizzare la somma totale di alcuni campi nella tabella figlia e mai l'utilizzo delle singole righe.

    Una soluzione potrebbe essere quella di mettere ad esempio un trigger che per ogni inserimento o variazione di una riga nella tabella figlia, vada a modificare un campo somma nella tabella padre per aggiornarlo con la nuova quantità.

    Anch'io ho avuto lostesso problema,   Delle fatture con una tabella padre   ( Cliente ecc) 

    e una tabella figlia dei singoli pezzi venduti e relativo prezzo

     

    E molto piu bello mantenere le tabelle pure e distinte ma poi quando devi fare il bilancio sono dolori

    Pperciò ho aggiunto un campo Somma alla tabella padre che viene aggiornato ad ogni variazione della tabella figlia.

     

    Confesso che la soluzione non mi piace ma non ho trovato di meglio.

     

    ____________________________________________________________________________________________

     

     

     

    Per garantire la correttezza delle somme ho poi creato una routine che all'avviamento della applicazione

    verifica che le somme presenti nella tabella padre corrispondano effettivamente alla somma degli importi

    della figlia e in caso di difformita me lo segnala ( io posso seguire quotidianamente il DB )

     

    Per tua tranquillita posso dirti che ad oggi  ( son passati 7 anni ) non ho mai avuto difformita nelle somme

     

     

    Saluti

     

     

     

     

    domenica 16 ottobre 2011 20:54
  • Ciao renarig, grazie per la risposta che mi "incoraggia" a seguire la soluzione con il campo somma aggiornato da trigger

    Diciamo che quando ho descritto il problema l'ho semplificato, nel senso che l'operazione principale che devo fare è quella, ma nel dettaglio il sistema è un po' più complesso e comprende diversi campi a volte dipendenti tra loro.

    Ad esempio nelle righe dettaglio ho quattro campi A B C D. All'occorrenza devo recuperare Somma(A - B) + Somma(c) + Somma(D)

    Una variante è che se aggiornando il campo B, quest'ultimo diventa > A, allora anche A deve diventate uguale a B.

    Inoltre ho altre due tabelle collegate che devono far aumentare A o B in base alla variazione di un loro campo.

    ..ecc.

    Quandi mi diventava più complesso seguire la strada dei trigger e del campo totale sempre aggiornato, ma mi semplificava molto il recupero dei dati totali a volte fatti su centiania di righe per volta e che sono poi gli unici ad essere visualizzati dal cliente molto spesso durante il giorno (e da più utenti in contemporanea).

    Al contrario se lascio tutti i dati indipendenti e recupero ogni volta le somme, mi semplifico a livello di codice, ma ho il timore delle prestazioni (dopo molti anni intendo).

    Ciao

     

    lunedì 17 ottobre 2011 06:22