Excuses pour la longueur de cette question.Recommandations pour la meilleure mise à jour SQL Performance et/ou le calcul des totaux stockonhand
J'ai une section de notre conception de base de données qui m'inquiète peut commencer à causer des problèmes. Ce n'est pas encore à ce stade, mais évidemment, je ne veux pas attendre jusqu'à ce que ce soit pour résoudre le problème. Mais avant que je commence à tester divers scénarios, j'apprécierais la contribution de toute personne ayant de l'expérience avec un tel problème.
La situation est Stock Control et maintien de la valeur StockOnHand.
Il serait possible de maintenir une table contenant les chiffres de contrôle de stock qui peuvent être mis à jour chaque fois qu'un ordre est entré manuellement ou en utilisant un déclencheur de base de données. Alternativement, vous pouvez obtenir SQL pour calculer les quantités en lisant et en additionnant les valeurs de ventes réelles.
Le programme est installé sur plusieurs sites dont certains utilisent MS-SQL 2005 et certains 2008.
Mon problème est compliqué parce que la même conception doit faire face à plusieurs scénarios, tels que:
1) Environnement de vente au comptant/de vente. La vente est entrée et le stock est réduit en une seule transaction. Aucune modification ne peut être faite à cette transaction.
2) Ordre/Routage/Confirmation Dans cet environnement, la commande est créée et peut être mise en attente, validée, acheminée, modifiée, livrée et facturée. Et à tout moment jusqu'à ce qu'il soit facturé, l'ordre peut être modifié. (Je mentionne cela parce que tous les déclencheurs de base de données peuvent être invoqués beaucoup de temps et doivent déterminer si les changements devraient affecter les stocks sur les chiffres)
3) Les entreprises différentes ont une idée différente de quand leur StockOnHand devrait être réduit. Par exemple, certains considèrent que les actions sont vendues lorsqu'elles approuvent une commande (puisqu'elles se sont engagées à vendre les marchandises et, partant, qu'elles ne devraient pas être vendues à une autre personne). D'autres ne considèrent pas le stock comme étant vendu tant qu'il ne l'a pas acheminé et d'autres seulement lorsqu'il a été livré ou collecté.
4) Il peut y avoir une grande variance dans le nombre de transactions par produit. Par exemple, un système a quatre ou cinq produits qui sont vendus plusieurs milliers de fois par mois, alors demander à SQL d'effectuer une somme sur ces transactions lit dix des milliers de transactions par an, alors que, sur le même système, il y en a plusieurs milliers d'autres produits où les ventes ne seraient que de moins de mille transactions par an et par produit.
5) L'information historique est importante. Pour cette raison, notre système ne supprime ni n'archive les transactions et a plusieurs années de transactions. 6) Le système doit avoir la capacité d'avertir les opérateurs s'ils n'ont pas le stock requis lors de la saisie de la commande (ce qui est souvent le cas en temps réel, par exemple commande téléphonique). Notez que ceci n'est requis que pour certains produits. (Mais je ne pense pas qu'il serait pratique d'additionner la quantité de transactions sur dix ou milliers de transactions en temps réel).
7) Prix moyen des coûts. Certains produits peuvent être évalués en fonction du coût moyen des articles en stock. La façon dont cela est mis en œuvre est que le prix du coût moyen est recalculé pour chaque marchandise dans la transaction, quelque chose comme newAverageCostPrice = (((oldAverageCostPrice * oldStockOnHand) + newCostValue)/newStockOnHand). Cela signifie que le stock en main doit être connu pour chaque marchandise si le produit utilise AverageCost.
La façon dont le système est actuellement implémenté est double. Nous avons une table qui contient le StockOnHand pour chaque produit et emplacement. Chaque fois qu'une vente est mise à jour, cette table est mise à jour via la couche de gestion de notre application (C#) Ceci ne fournit que le stock actuel en main.
Si vous devez exécuter une valorisation de stock pour une date donnée, ce chiffre est calculé en effectuant une somme des quantités sur les lignes concernées. Cela nécessite également une jointure entre la ligne de vente et les tables d'en-tête de vente car la quantité et le produit sont stockés dans le fichier de ligne et la date et le statut sont uniquement conservés dans la table d'en-tête.
Cependant, il existe des inconvénients à cette méthode, tels que.
L'exécution du rapport d'évaluation des stocks est lente (mais pas d'une lenteur inacceptable), mais je ne suis pas satisfait. (Cela fonctionne et surveiller le serveur ne le montre pas surchargé, mais il a le potentiel de causer des problèmes et donc nécessite une surveillance régulière)
La logique du code mettant à jour la table StockOnHand est compliquée.
Cette table est mise à jour fréquemment. Dans de nombreux cas, cela n'est pas nécessaire car les informations n'ont pas besoin d'être vérifiées. Par exemple, si 90% de votre entreprise vend 4 ou 5 produits, vous n'avez pas besoin d'un ordinateur pour vous dire que vous êtes en rupture de stock.
Base de données de triggers. Je n'ai jamais implémenté de déclencheurs compliqués auparavant, alors méfiez-vous de cela. Par exemple, comme indiqué précédemment, nous avons besoin d'options de configuration pour déterminer les conditions dans lesquelles les chiffres de stock doivent être mis à jour. Ceci est actuellement lu une fois et mis en cache dans notre programme. Faire cela à l'intérieur d'un déclencheur signifierait nécessairement lire cette information pour chaque déclencheur. Est-ce que cela a un grand impact sur la performance.
Nous pouvons également avoir besoin d'un déclencheur sur l'en-tête de vente et la ligne de vente. (Cela pourrait signifier qu'une modification de l'en-tête de vente serait obligée de lire les lignes et de mettre à jour le stock pour les produits concernés, puis plus tard les lignes seraient sauvegardées et un autre déclencheur de base de données modifierait à nouveau la Une autre alternative serait de ne mettre à jour la table StockOnHand que lorsque la transaction est facturée (ce qui signifie qu'aucune autre modification ne peut être effectuée) et de fournir une fonction pour calculer le chiffre stockonhand basé sur une union de cette table et les transactions non facturées qui affectent stock.
Tout conseil serait
Pouvez-vous ajouter un 'tldr;'? – RedFilter
Avez-vous envisagé d'avoir une base de données de type entrepôt de dates à des fins de reporting? Cette somme peut être effectuée toutes les deux heures pour votre mise à jour de la base de données de reporting. – Paddy
L'a considéré, mais l'a écarté pour un certain nombre de raisons. Il semble commun d'effectuer l'évaluation des stocks, puis de procéder à des corrections (par exemple pour le gaspillage) et de réexécuter l'évaluation des stocks.Je pense que cela causerait plus de problèmes si les chiffres des stocks n'incluaient pas ces corrections. – sgmoore