des conseils sur les attributs SQL précalculées
-
18-09-2019 - |
Question
Souvent, je traite avec des entités globales ou des parents qui ont des attributs dérivés de leurs membres constitutifs ou les enfants. Par exemple:
-
Le
byte_count
etpacket_count
d'un objet est calculée à partirTcpConnection
les mêmes attributs de ses deux objetsTcpStream
constitutifs, qui sont à leur tour calculée à partir de leurs objetsTcpPacket
constitutifs. -
Un objet
Invoices
pourrait avoir untotal
qui est essentiellement la somme () de sonInvoiceLineItems
constituant » des prix, avec un peu de fret, de réduction et de la taxe logique jeté.
Lorsque vous traitez avec des millions de paquets ou des millions de postes facturés (je veux!), Le calcul à la demande de ces attributs dérivés - soit dans une vue ou plus communément dans la logique de présentation comme des rapports ou des interfaces Web - est souvent beaucoup trop lent.
Comment décidez-vous, avant les problèmes de performances forcent la main, que ce soit à « promouvoir » les attributs dérivés aux champs précalculées?
La solution
Personnellement, je ne dénormaliser que des compromis forcer la main de performance (parce que la baisse de dénormalisations sont à mon humble avis trop drastique), mais vous pourriez aussi envisager:
- Commodité : par exemple si deux applications clientes différentes veulent calculer les mêmes attributs dérivés, ils ont tous deux à coder les requêtes pour les calculer. Dénormalisation offre à la fois client applications l'attribut dérivé d'une manière plus simple.
- Stabilité au fil du temps : par exemple si la formule de calcul d'un attribut dérivé est modifiable, dénormalisation vous permet de capturer et de stocker la valeur dérivée à un point dans le temps des calculs si l'avenir ne sera jamais se tromper
- requêtes Simpler :. Complexifier la structure DB peut signifier votre requête de sélection est plus simple à la fin du client
- Performance :. Sélectionner des requêtes sur des données dénormalisées peut être plus rapide
Ref: La base de données du programmeur: L'argument pour dénormalisation . Assurez-vous de lire aussi bien son article sur Honorer les valeurs dénormalisées correcte - sa recommandation est d'utiliser les déclencheurs. Cela nous amène à la maison le genre de dénormalisation de compromis exige.
Autres conseils
En fait, vous ne le faites pas. Vous avez laissé les problèmes de performances forcer la main.
C'est la meilleure réponse parce que 99% du temps, vous devriez pas être pré-optimisation comme celui-ci, il vaut mieux que calco à la volée.
Cependant, il est assez fréquent pour les développeurs client applications à venir au côté serveur avec des idées préconçues erronées comme « calcul sur la demande de ... attributs dérivés ... - est souvent trop lent », et ce n'est pas vrai. ici la formulation correcte serait " rarement trop lent ".
En tant que tel, à moins que vous êtes un expert dans ce (un architecte de développement DB, etc.), vous ne devriez pas être dans l'optimisation prématurée engagez. Attendez jusqu'à ce qu'il soit évident qui doit être fixé, puis regarder pré-agrégation.
Comment les données en cours doivent être détermine la façon dont vous le mettre en œuvre, vraiment.
Je suppose que 2 états simples: courant ou non courant
.- Current: vues indexées, stockées, déclencheurs procs pour maintenir des tables d'agrégation, etc
- Pas à jour: rapports instantanés de service, envoi de journaux / réplication, entrepôt de données, etc.
Cela dit, je développais contre la même quantité de données que je prod donc j'ai une certaine confiance dans le temps de réponse. Il est rarement surpris par les performances de votre code ...