guida precalcolate SQL attributi
-
18-09-2019 - |
Domanda
Spesso ho a che fare con aggregati o entità padre che hanno attributi derivati dal loro costituenti, o figli di soci.Per esempio:
Il
byte_count
epacket_count
di unTcpConnection
oggetto viene calcolato dalla gli stessi attributi dei suoi due costituentiTcpStream
gli oggetti, che a loro volta sono calcolate dal costituenteTcpPacket
oggetti.Un
Invoices
oggetto potrebbe avere untotal
che in pratica è la SOMMA() del suo costituenteInvoiceLineItems
'i prezzi, con un po' di merci, sconto e fiscali la logica del linguaggio.
Quando ha a che fare con milioni di pacchetti o milioni di fatturato voci (lo spero!), su richiesta di calcolo di questi attributi derivati -- in VISTA o, più comunemente, in una logica di presentazione, come le relazioni o interfacce web-è spesso troppo lento.
Come si fa a decidere, prima di problemi di prestazioni di forzare la mano, se per "promuovere" gli attributi derivati di pre-calcolate campi?
Soluzione
Io personalmente non utilizzo della denormalizzazione fino a compromessi in termini di prestazioni forza la mia mano (perché il rovescio della medaglia di denormalizations sono troppo drastiche IMHO), ma si potrebbe anche prendere in considerazione:
- Convenienza:ad es.se due diverse applicazioni client desidera calcolare gli stessi attributi derivati, entrambi hanno a che codice della query per eseguire i calcoli.La denormalizzazione offre entrambe le applicazioni client, l'attributo derivato in un modo più semplice.
- La stabilità nel tempo:ad es.se la formula per il calcolo di un attributo derivato è mutevole, la denormalizzazione consente di catturare e memorizzare il valore calcolato in un punto nel tempo in modo calcoli futuro non sarà mai sbagliata
- Più semplice query:aggiungere complessità al DB struttura può significare la query Select è più semplice, e presso il cliente finale.
- Prestazioni:Selezionare query su denormalizzato dati può essere più veloce.
Rif: Il Programmatore Di Database:L'Argomento per la denormalizzazione.Assicurarsi di leggere il suo articolo su Talmente Semplice Mantenere Aggiornati I Denormalizzato Valori Corretti - la sua raccomandazione è di utilizzare i trigger.Che porta a casa il tipo di trade-off la denormalizzazione richiede.
Altri suggerimenti
Sostanzialmente, non si.Hai lasciato riguardanti le prestazioni di forzare la mano.
Che è la risposta migliore, perché il 99% del tempo, si dovrebbe non essere pre-ottimizzazione come questa, è meglio calc on the fly.
Tuttavia, è abbastanza comune per cliente-gli sviluppatori di applicazioni per venire al server-side sbagliati preconcetti come "su richiesta di calcolo di ...attributi derivati...-- è spesso lentezza inaccettabile"e questo semplicemente NON È vero.La corretta formulazione qui sarebbe "è raramente lentezza inaccettabile".
Come tale, a meno che non sono un esperto in questo (un DB di Sviluppo, Architetto, etc.), si dovrebbe non essere coinvolto in precoce di ottimizzazione.Attendere fino a quando è ovvio che deve essere fissato, quindi guardate pre-aggregazione.
Come corrente, i dati devono essere determina come viene implementata, davvero.
Assumo 2 semplici stati:corrente o non corrente.
- Corrente:indicizzate viste, trigger, stored procedure per mantenere le tabelle di aggregazione ecc
- Non corrente:Servizio di segnalazione di istantanee, di registro per la spedizione e la replica dei dati di magazzino ecc
Detto questo, vorrei sviluppare contro la stessa quantità di dati che ho in prod quindi ho un po ' di fiducia nel tempo di risposta.Raramente essere sorpreso dal tuo codice di prestazioni...