En général, j'utilise toujours Ints. Je sais que , en théorie , ce n'est pas la meilleure pratique, cependant, puisque vous devez utiliser le plus petit type de données qui sera garanti pour stocker les données.
Par exemple, il est préférable de l'utiliser tinyint
lorsque vous savez que les seules données que vous allez stocker sont 1, 0 ou nulles (avec une très faible chance de les étendre ultérieurement à 2 ou 3).
Cependant, la seule raison que je connaisse pour cela est pour des raisons de stockage - en utilisant 1 octet sur une ligne au lieu de 4 octets.
Quel est l’impact de l’utilisation tinyint
(ou smallint
même bigint
) sur la seule utilisation int
, autre que l’économie d’espace sur votre disque dur?
sql-server
database-theory
Richard
la source
la source
I'd use an ENUM for such a thing.
Pas dans SQL Server, vous ne le feriez pas, car il ne comporte aucune énumération.Réponses:
L'espace disque est bon marché ... ce n'est pas la question!
Arrêtez de penser en termes d'espace de stockage, pensez plutôt au pool de tampons et à la bande passante de stockage . À l'extrême, cache du CPU et bande passante du bus mémoire . L'article lié fait partie de la série mettant en exergue les problèmes liés à une sélection de clé en cluster médiocre (INT, GUID ou GUID séquentiel), mais souligne la différence que les octets peuvent faire.
Le message primordial est la conception. La différence n'apparaîtra pas dans une base de données individuelle sur un serveur spécifié de manière appropriée jusqu'à ce que vous atteigniez le territoire VLDB, mais si vous pouvez enregistrer quelques octets, pourquoi ne pas le faire.
Je me souviens de l'environnement décrit dans une question précédente . Plus de 400 bases de données, d'une taille allant de 50 Mo à 50 Go, par instance SQL. Nettoyer quelques octets par enregistrement, par table et par base de données dans cet environnement peut faire toute la différence.
la source
En plus des autres réponses ...
Les lignes et les entrées d'index sont stockées dans des pages de 8 000 pages. Ainsi, un million de lignes à 3 octets par ligne ne représente pas 3 Mo sur le disque: cela affecte le nombre de lignes par page ("densité de page").
La même chose s'applique à nvarchar to varchar, smalldatetime à datetime, int à tinyint, etc.
Edit, juin 2013
http://sqlblog.com/blogs/joe_chang/archive/2013/06/16/load-test-manifesto.aspx
Cet article dit
Donc, le choix du type de données est important
la source
Ce n'est pas seulement le stockage sur table qui compte. Si vous utilisez des index dans lesquels la colonne int fait partie d'une clé composée, vous voudrez naturellement que les pages d'index soient aussi complètes que possible, ce qui résulte en des entrées d'index aussi petites que possible.
Je m'attendrais certainement à constater que l'examen des entrées d'index dans les pages BTREE serait un peu plus rapide avec des types de données plus petits. Cependant, toute VARCHAR impliquée dans les entrées d'index compenserait (annulait) les gains de performances résultant de l'utilisation de TINYINT sur INT.
Néanmoins, si les entrées d'index ont des entrées composées et que toutes sont des entiers, plus les entiers sont petits, plus le nombre est élevé, mieux c'est et plus vite.
la source
Toutes les choses deviennent de plus en plus complexes lorsque les bases de données s'agrandissent:
Et quels types de données ont à voir avec cela? TOUT. Utiliser des tailles de ligne plus grandes que nécessaire amène les pages de la base de données à se remplir plus tôt que nécessaire, voire à gaspiller de l'espace si la taille de la ligne est telle que plus d'un enregistrement ne peut être enregistré sur la page. Le résultat est qu'il faut plus de pages pour écrire et lire, plus de mémoire RAM est utilisée pour mettre en cache cette mémoire (les gros disques ont besoin de plus de mémoire). Et puisque vos types de données sont spécifiés plus volumineux que nécessaire sur le disque, vos index subiront le même problème - en particulier si vous mettez en cluster cette clé primaire composée de 2 colonnes BIGINT composites, car tout autre index créé copiera cette clé primaire implicitement dans leur définition.
Si vous savez que certaines colonnes d'une table auront des millions de lignes ou même une petite table qui passera de FK à plusieurs millions de lignes et ne nécessitera pas un entier de 4 octets pour stocker leurs données, mais un octet de 2 suffire - utilisez SMALLINT . Si des valeurs comprises entre 0 et 255 sont suffisantes, TINYINT . Un drapeau Oui / Non? Il y a BIT .
la source
Bien que pour
tinyint
vs,int
il existe des différences claires telles que l’espace disque, les divisions de page et le temps de maintenance, il n’y en a pasvarchar
.Alors, pourquoi ne pas déclarer tous les champs de texte comme étant
varchar(4000)
donné qu’ils ne vont utiliser que l’espace nécessaire? De plus, vous aurez la garantie que vos données ne seront jamais tronquées.La réponse est bien sûr:
Ces mêmes raisons s’appliquent
tinyint
également.la source