SQL Server type de champ est meilleur pour le stockage de prix des valeurs?
Je me demande quel est le meilleur type pour un prix de terrain dans SQL Server pour un magasin comme la structure?
Regardant cette vue d'ensemble nous avons des types de données appelé de l'argent, smallmoney, puis nous avons décimal/numérique et enfin float et réel.
Nom, de la mémoire/disque-utilisation et plages de valeurs:
- De l'argent: 8 octets (valeurs: -922,337,203,685,477.5808 à +922,337,203,685,477.5807)
- Smallmoney: 4 octets (valeurs: -214,748.3648 à +214,748.3647)
- Décimal: 9 [par défaut, min. 5] octets (valeurs: -10^38 +1 à 10^38 -1 )
- Float: 8 octets (valeurs: -1.79 E+308 à 1,79 E+308 )
- Réel: 4 octets (valeurs: -3.40 E+38 à 3,40 E+38 )
Est-il vraiment sage de prix du magasin valeurs de ces types? Que penser, par exemple. INT?
- Int: 4 octets (valeurs: -2 147 483 648 à de 2 147 483 647)
Disons une boutique utilise des dollars, ils ont des cents, mais je ne vois pas de prix $49.2142342 donc l'utilisation d'un lot de décimales montrant cents semble déchets de SQL de la bande passante. Deuxièmement, la plupart des boutiques de ne pas afficher les prix de près de 200.000.000 (pas dans la normale web-boutiques à moins, à moins que quelqu'un essaye de me vendre une célèbre tour à Paris)
Alors pourquoi ne pas opter pour un int?
Un int est rapide, son seulement 4 octets, et vous pouvez facilement faire des décimales, par enregistrer les valeurs en cents au lieu de dollars et ensuite de diviser lorsque vous présentez les valeurs.
L'autre approche serait d'utiliser smallmoney qui est de 4 octets en trop, mais il faudra le calcul de la partie de la CPU pour faire le calc, où en tant que Int est la puissance entière... sur le revers de la médaille, vous aurez besoin de diviser chaque résultat.
Sont là toute la "monnaie" des problèmes liés aux paramètres régionaux lors de l'utilisation de smallmoney/de l'argent des champs? quels seront ces transfert de trop en C#/.NET ?
Les avantages/inconvénients? Aller pour l'entier de prix ou de smallmoney ou de quelques autres?
Quelle est votre expérience?
- Merci à tous pour vos réponses! J'ai eu un sentiment que nous pourrions mettre fin à ces résultats. Donc, je suis greatfull que vous avez confirmé cela pour moi. Je pense que nous allons aller smallmoney pour commencer. Ses pas tellement sur le "espace de stockage" (le prix) mais merly la quantité ou de données transférées, plus et plus de disque à mémoire + chaque jointure et de la somme de 4 octets supplémentaires à gérer avec de l'argent plutôt que de petite de l'argent. Je vais donc voir que les réponses que je trouve le mieux et ensuite voter ceux-ci certains d'entre vous aussi! Merci les gens! Vraiment! Son appriciated!
- L'arrondissement les problèmes causés par l'utilisation de l'argent ne devrait pas être ignoré. La réponse par @sqlvogel est très important.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes absolument sûr de votre numéros de toujours rester dans la gamme de
smallmoney
, utilisez-le et vous pouvez économiser quelques octets. Sinon, je voudrais utilisermoney
. Mais rappelez-vous, le stockage est bon marché ces jours-ci. Le supplément de 4 octets sur 100 millions d'enregistrements est encore inférieur à la moitié d'un GO. Comme @marc_s souligne, cependant, l'utilisation desmallmoney
si vous pouvez réduire l'empreinte mémoire de SQL server.Longue histoire courte, si vous pouvez vous en sortir avec
smallmoney
, faire. Si vous pensez que vous pourrait aller sur le max, utilisermoney
.Mais, ne pas utiliser une variable de type decimal ou vous obtiendrez d'arrondi questions et commencez à perdre ou de gagner de l'aléatoire cents, à moins que vous traiter avec eux correctement.
Mon argument contre l'utilisation de
int
: Pourquoi réinventer la roue en stockant unint
et puis d'avoir à vous rappeler de le diviser par 100 (10000) pour récupérer la valeur et de se multiplier en arrière quand vous allez pour stocker la valeur. Ma compréhension, c'est l'argent des types d'utiliser unint
oulong
que le stockage sous-jacent type de toute façon.Autant que le type de données correspondant dans .NET, il sera
decimal
(ce qui permettra aussi d'éviter l'arrondissement des problèmes dans votre code C#).smallmoney
vais garder la mémoire utilisation de la serveur en bas, à droite? Il n'est donc pas en vain.Utiliser le De l'argent type de données si vous êtes le stockage de l'argent (à moins que la modélisation d'énormes quantités d'argent que la dette nationale), il évite de précision/arrondi.
Les Nombreux Avantages de l'Argent...Type de Données!
UTILISEZ NUMÉRIQUE /DÉCIMAL. Éviter d'ARGENT /SMALLMONEY. Voici un exemple de pourquoi. Tôt ou tard, l'ARGENT /SMALLMONEY types seront susceptibles de vous laisser tomber à cause des erreurs d'arrondi. L'argent types sont complètement superflu et de parvenir à rien d'utile - un montant en devise être juste un autre nombre décimal comme les autres.
Enfin, l'ARGENT /SMALLMONEY types sont la propriété de Microsoft. NUMÉRIQUE /DÉCIMAL font partie de la norme SQL. Ils sont utilisés, reconnu et compris par le plus de gens et sont pris en charge par la plupart des Sgbd et d'autres logiciels.
Personnellement, j'utiliserais smallmoney ou de l'argent pour magasin de la boutique de prix.
À l'aide de int ajoute à la complexité ailleurs.
Et 200 millions de dollars est parfaitement valide de prix en Won coréen ou Roupies Indonésiennes trop...
Types de données SQL
money
etsmallmoney
à la fois résoudre à c#decimal
type:http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx
Donc je pense que vous pourriez aussi bien aller pour
decimal
. Personnellement, j'ai été en utilisantdouble
toute ma vie de travail dans l'industrie financière et n'ont pas connu de problèmes de performances, etc. En fait, j'ai constaté que pour certains calculs, etc., augmentation de la taille du type de données permet une plus grande précision.Je pencherais pour de l'Argent de type de données. Invididually vous ne pouvez pas dépasser la valeur de Smallmoney, mais il serait facile pour plusieurs éléments de la dépasser.
Dans mon prêteur sur gages application, le prêteur sur gages opérateurs de prêter à partir de 5,00 $à 10 000$.00
Lorsqu'ils calculent le montant du prêt qu'ils arrondir au dollar le plus proche afin de
éviter de traiter avec des cents (la même chose s'applique pour les paiements d'intérêts). Lorsque le montant du prêt est au-dessus de $50.00 ils seront tour à la plus proche de 5,00 $(c'est à dire $50, $55, $60 ...), encore de minimiser l'exécution de billets d'un dollar. Donc, j'utilise DECIMAL(7,2) pour la transaction.calculated_loan_amount et DECIMAL(5,0) pour la transaction.loan_amount.
L'application calcule le montant du prêt de la pièce et des lieux de ce montant dans loan_amount où il est arrondi au dollar le plus proche lorsque en dessous de 50$, ou au plus proche de $5.00, lorsqu'un plus.