web-dev-qa-db-fra.com

Types de données SQL et Smallint / Tinyint VS Integer régulier

Quels sont les avantages du serveur SQL d'utiliser des types de données appropriés?

Exemple:

  1. Smallint/Tinyint vs Integer ordinaire
  2. Décimal (2) vs flotter
  3. Varchar (100) vs char (100)

Est-ce que ça compte vraiment ces jours-ci, avec l'informatique moderne?

Merci,

4
user129291

Quels sont les avantages du serveur SQL d'utiliser des types de données appropriés?

Si vous utilisez le bon type de données, votre base de données correspondra mieux à votre modèle et est plus susceptible d'être efficace en termes d'espace et de vitesse. Vous risquez de faire fermer cette question comme "trop large" car cela peut être assez vaste.

Pour toucher vos points plus spécifiques:

Smallint/Tinyint vs Integer ordinaire

Les types plus petits prennent moins d'espace afin que davantage de lignes ajustées dans une page entraînant moins d'espace pris sur disque et en mémoire. Bien sûr, si vous choisissez un type trop petit, votre application échouera. Considérons également BIGINT pour une valeur supérieure à 2 147 483 648 (ou inférieure à -2 147 483 647) pourraient être nécessaires.

La différence est multipliée lorsque vous envisagez des index: les types plus gros se retrouvent dans n'importe quel index qui couvre également les colonnes.

Décimal (2) vs flotter

Il y a une énorme différence ici. DECIMAL (et son synonyme NUMERIC) sont en fait des entiers mis à l'échelle garantissant la précision que vous spécifiez. Les nombres de points flottants ont leurs utilisations, mais soient très prudents avec eux, car ils ne sont que des approximations en raison de problèmes d'arrondissement de la convertissement entre les formes binaires et décimales - l'exemple le plus courant est de 0,1 + 0,2 ne sera généralement pas égal à 0,3. Voir http://floating-point-gui.de/ Parmi les autres références pour plus de détails et exécutez ceci pour voir l'effet de première main:

SELECT CAST(0.1 AS FLOAT        ) + CAST(0.2 AS FLOAT        ), CASE WHEN CAST(0.1 AS FLOAT        ) + CAST(0.2 AS FLOAT        ) = 0.3 THEN 'OK' ELSE 'oops' END
SELECT CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2)), CASE WHEN CAST(0.1 AS DECIMAL(10,2)) + CAST(0.2 AS DECIMAL(10,2)) = 0.3 THEN 'OK' ELSE 'oops' END

Essentiellement: n'utilisez pas FLOAT si vous savez que c'est ce dont vous avez besoin.

Varchar (100) vs char (100)

Les types de longueur variable sont beaucoup plus efficaces sages spatiaux, mais moins efficaces pour traiter la CPU-sage. Si vous utilisez (MAX), Ils sont susceptibles d'être stockés hors page, ce qui est encore moins efficace et empêche la prise de compression si vous utilisez cela sur vos tables. Si vous utilisez une compression de ligne ou de page, vos types de longueur fixe deviennent de la longueur variable de toute façon mais Vous conservez la validation de longueur intégrée qui peut être utile pour votre modèle. .

Est-ce que ça compte vraiment ces jours-ci, avec l'informatique moderne?

Réponse courte: oui.
Longue réponse: yyyyyyyeeeeeeeeeeeeesssssssssssssss!

Les considérations peuvent être un peu différentes avec des processeurs modernes - ils peuvent être beaucoup plus rapides par rapport au stockage et au transfert de réseau qu'auparavant, il est donc plus souvent une bonne optimisation pour économiser de la place au détriment du temps de processeur supplémentaire, mais le choix correct de type choix beaucoup importe encore.

Bien que le choix de type importe la plupart des problèmes autres que l'optimisation: les types corrects mieux modélisent vos données qui devraient être votre première priorité.

17
David Spillett

L'avantage de l'utilisation du type approprié est la mémoire [~ # ~] [~ # ~ ~] que SQL Server utilise pour stocker des données de ce type ou de ce type .

  1. TinyInt - 1 octet (peut stocker des valeurs entières 0-255)
  2. SmallInt - 2 octets (peut stocker des valeurs entières -32 768 - 32 767)
  3. Int - 4 octets (peut stocker entier valeur -2 ^ 31 - 2 ^ 31 -1)
  4. BigInt - 8 octets (peut stocker entier de valeur -2 ^ 63 - 2 ^ 63 -1)
  5. Varchar(n) - Peut stocker des chaînes avec des symboles moins ou égaux n. Il utilisera 1 octet pour chaque symbole de votre chaîne.

    DECLARE @String varchar(100) = 'Hi' -- 2bytes
    DECLARE @String varchar(100) = 'Hello' -- 5bytes
    
  6. char(n) - Peut stocker des chaînes avec des symboles moins ou égaux n. Il utilisera n octets de mémoire nul note combien de symboles que vous avez mis.

    DECLARE @String char(100) = 'Hi' -- 100bytes
    DECLARE @String char(100) = 'Hello' -- 100bytes
    

Vous pouvez lire des différences sur float et decimal types de données ICI

4

Cela compte certainement même ces jours-ci même avec l'informatique moderne. Je suppose que ça va de très longtemps. L'utilisation de fichiers de données appropriés peut vous enregistrer MBs. Même GBs parfois.

Jetez un coup d'œil à l'article Aaron Bertrand ici .

Cela clarifiera les choses pour vous.

2
George K