SQL: le meilleur moyen de stocker des valeurs oui/non? S'occuper de la performance dans d'immenses bases de données
J'ai quelques colonnes où je dois stocker essentiellement des valeurs oui/non.
Par exemple l'état de l'utilisateur pour l'actif ou inactif. Newsletter abonnez-statut pour souscrits ou unsuscribed.
Eh bien, je veux savoir (en tenant compte des tables avec beaucoup d'enregistrements) si le meilleur moyen est de mettre un petit int char longueur 1 et de l'ensemble 1 pour oui et 0 pour non.
Est-ce une bonne chose? Ou il n'y a pas d'impact sur les performances des requêtes db lors de l'utilisation de mots comme oui, non, actif, inactif, souscrits, etc.
merci d'avance.
Je dirais que la différence entre
Cela pourrait être vrai pour les petites tables, mais une fois que vous atteindre des centaines de millions de lignes, vous verrez la différence.
'yes' == 'yes'
et '1' = '1'
est si négligeable que ça n'a pas vraiment d'importance. Tant que vous n'allez pas le "the_value_is_true_therefore_the_user_clicked_the_agree_button"
chemin, vous devriez être bien. D'autre part j'ai toujours été un fan de l'utilisation de chiffres à la place des cordes, ils me donnent ce sentiment d'exactitude que les chaînes ne sont pas.Cela pourrait être vrai pour les petites tables, mais une fois que vous atteindre des centaines de millions de lignes, vous verrez la différence.
OriginalL'auteur Hernantz | 2010-12-04
Vous devez vous connecter pour publier un commentaire.
Sémantiquement, je vous suggère d'utiliser
bit
si elle est disponible pour vous. Lorsque l'on regarde la colonne, n'importe quel autre développeur peut immédiatement déterminer une valeur de type boolean est stockée. Si vous n'avez pasbit
, essayez d'utilisertinyint
. Veiller à ce que1
est le seultrue
valeur et0
est le seulfalse
valeur apportera plus de cohérence. Sinon, vous pourriez vous retrouver avec un désordre mélange detrue
/false
,yes
/no
,valid
/invalid
,y
/n
, et/out
/f
.Comparant
bit
outinyint
valeurs n'est probablement pas plus lent que la comparaison de chaînes, et même si elle était plus lente que la comparaison de chaînes, je ne peux pas imaginer avoir un effet significatif sur la vitesse globale.Pris en lui-même, je ne pense qu'
'y'
/'n'
est plus lisible que1
/0
. Cependant, certains développeurs pourraient se retrouver à l'aide de leur propre "animal de compagnie" des lettres (ou même"1"
/"0"
!). En outre, il est plus facile de jeter un booléenbit
/tinyint
que c'est une lettre."la comparaison des bits ou des valeurs tinyint n'est probablement pas plus lent que la comparaison de chaînes"je suis un ordinateur. Je parle en binaire. Je ne parle pas des chiffres ou des lettres ou toute langue parlée. Je parle en binaire. Quand je compare un peu, j'ai regarder un peu unique. Quand je compare les "cordes", je dois chercher au nombre de bits qui représentent votre numéro ou d'une lettre ou d'un mot. Bien que je peux faire des choses très rapide, le plus vous me demandez de faire plus de plus de il prend.
OriginalL'auteur ClosureCowboy
Est-il quelque chose que vous ne aimez pas à propos de la " bit " type de données?
eh bien, j'ai juste appris à propos de ce type de bit. Il est peut-être ce dont j'ai besoin, si cela vaut vraiment la peine de l'impact sur les performances chose
OriginalL'auteur John Saunders
Le plus souvent pris en charge moyen est d'utiliser
CHAR(1)
- sur la plupart des bases de données, il prend la même quantité d'espace que PEU (en supposant BITS est disponible, 1 octet), mais prend en charge plus de valeurs (26 si insensibles à la casse, 52 en cas de non) si il n'y a aucune chance de prendre en charge plus de valeurs. Contrairement àBIT
,CHAR(1)
est lisible par l'homme. Aussi,BIT
n'est pas pris en charge sur chaque base de données.Bien que, je trouve la 1 et 0 à être lisible par un humain (en supposant que la "normale" logique où 0 est faux et 1 n'est pas faux), si peut-être programmeur. Je mettrais un plus grand poids sur la cohérence.
Depuis quand est-BIT pas lisible par l'homme? Ah, j'ai oublié ces jours, personne ne comprend binaire/hexadécimal représentations.
En fait dans SQL Server, jusqu'à 8 champs de BITS peuvent être combinés dans un seul OCTET - c'est 8 fois moins d'espace que les 8 CHAR(1) les domaines....
Oui, mais c'est seulement après, vous pouvez ajouter des huit champs de BITS
OriginalL'auteur OMG Ponies
Si votre SGBDR prend en charge les index bitmap, allez PEU à chaque fois. Si cela ne fonctionne pas, utiliser ce que vous voulez, il n'y a vraiment pas de différence entre char(1), de type tinyint (byte).
OriginalL'auteur Pavel Urbančík
Êtes-vous simplement en demandant en général, que le moyen le plus efficace pour stocker un oui/non indicateur est?
Ou vous avez un problème de performance à portée de main?
Si oui, quand avez-vous le problème de performances (des requêtes spécifiques, inserts, entretien, etc)? Ce type de gain de performance que vous recherchez?
2%? 10%? 50%?
Évolution des types de données sera probablement résultat en seulement une légère amélioration, à moins que nous parlons de plusieurs centaines de millions de lignes. Je vais vous donner un exemple. Disons que, quel que soit le changement que vous avez fait, que vous vous êtes rasé de 3 octets par ligne. Disons que la table contient 100,000,000 lignes. Que serait une économie de ~285 mo. En supposant que le sous-système de disque peut vous fournir 100 mo/s que vous avez enregistré un énorme 3 secondes pour numériser une table entière. Quelque chose me dit que les utilisateurs en pensent les 2 heures et 3 secondes vs 2 heures en est de même de même 🙂
OriginalL'auteur Ronnis
Mon intuition aurait dit de la performance aurait été mieux avec des tinyints, mais ce post n'est pas vraiment nue que la pensée. Cette DONC post propose également quelques autres des opinions intéressantes.
Je pense que le fait d'effectuer l'analyse avec les données stockées comme des numéros de est généralement plus facile que les données de caractère. Quels sont les autres programmes que vous allez à l'interface et à l'utilisation? Par exemple, plusieurs de mes outils d'analyse de ne pas lire les données de caractère à tous, nous avons donc recoder toutes les données que nous recevons dans le format de "oui", "non", etc.
OriginalL'auteur Chase