Question

Je table avec des champs que la valeur sera 1 0. Cette table sera extrêmement importante des heures supplémentaires. Est-il bon d'utiliser peu ou son type de données mieux utiliser différents types de performance? Bien sûr, tous les champs doivent être indexés.

Était-ce utile?

La solution

Officiellement sera bit le plus rapide, surtout si vous ne permettez pas nulls. Dans la pratique, il importe peu, même dans les grands usages. Mais si la valeur ne sera 0 ou 1, pourquoi ne pas utiliser un peu? On dirait que le meilleur moyen de faire en sorte que la valeur ne sera pas rempli de choses invalides, comme 2 ou -1.

Autres conseils

Je ne peux pas vous donner des statistiques sur la performance, cependant, vous devez toujours utiliser le type qui est le mieux représentatif de vos données. Si vous voulez tout est 1-0 alors absolument vous devez utiliser le champ de bits.

Plus d'informations vous pouvez donner à votre base de données plus il est probable de l'obtenir est « » droit des suppositions.

Si je comprends bien, vous avez encore besoin d'un octet pour stocker une colonne de bits (mais vous pouvez stocker 8 colonnes de bits dans un seul octet). Donc, avoir un grand nombre (combien?) De ces colonnes de bits pourrait vous faire économiser un peu sur le stockage. Comme Yishai a dit qu'il ne sera probablement pas faire une grande différence de performance (bien qu'un peu se traduira par un booléen dans le code d'application plus bien).

Si vous pouvez dire avec 100% de confiance que les deux options pour cette colonne ne changera jamais alors par tous les moyens utilisent le bit. Mais si vous pouvez voir une troisième valeur d'apparaître dans l'avenir, il pourrait rendre la vie un peu plus facile quand ce jour viendra d'utiliser un tinyint.

Juste une pensée, mais je ne suis pas sûr de bien un indice fera vous sur cette colonne soit, à moins que vous voyez la grande majorité des lignes allant d'un côté ou l'autre. Dans une prise à peu près 50/50 distribution que vous pourriez en fait plus d'un coup en gardant l'index à jour qu'il gagne, vous verriez dans interrogeant la table.

Cela dépend.

Si vous souhaitez maximiser la vitesse de sélections, l'utilisation int (tinyint pour économiser l'espace), parce que peu dans la clause where est plus lent alors int (pas de façon drastique, mais chaque millième de seconde). Assurez-vous également la colonne non nulle qui accélère aussi les choses. Ci-dessous le lien pour tester la performance réelle, que je recommande à courir à votre propre base de données et d'étendre également à l'aide d'indices, pas les valeurs NULL et en utilisant plusieurs colonnes à la fois. À la maison, j'ai même essayé de comparer l'utilisation de plusieurs colonnes de bits vs plusieurs colonnes tinyint et colonnes TinyInt étaient plus rapides (select count(*) where A=0 and B=0 and C=0). Je pensais que SQL Server (2014) optimiserait en faisant une seule comparaison à l'aide bitmask, il devrait donc trois fois plus vite, mais ce ne fut pas le cas. Si vous utilisez des index, vous auriez besoin de plus de 5.000.000 lignes (tel qu'il est utilisé dans le test) pour constater une différence (que je ne l'ai pas eu la patience de le faire depuis la table de remplissage avec plusieurs millions de lignes prendrait âges sur ma machine).

https://www.mssqltips.com/sqlservertip/4137/sql-server-performance-test-for-bit-data-type-in-a-where-clause/

Si vous voulez économiser de l'espace, peu d'utilisation, puisque 8 d'entre eux peuvent alors un octet et occuper 8 tinyints sera OCCUP 8 octets. Ce qui est d'environ 7 Mégaoctets enregistrées sur chaque million de lignes.

Les différences entre ces deux cas sont fondamentalement et puisque l'utilisation negligable bit a la tête de signalisation que la colonne représente simplement un drapeau, je vous recommande d'utiliser peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top