2010-04-15 6 views
1

J'ai une base de données qui utilise des codes. Chaque code peut avoir entre deux caractères et dix caractères.SQL Meilleure performance: char (10) et trim ou varchar (10)

Dans MS SQL Server, est-il préférable d'utiliser pour la performance char(10) pour ces codes et les rtrim comme ils viennent, ou devrais-je utiliser varchar(10) et ne pas avoir à vous soucier de tailler les espaces supplémentaires? J'ai besoin de me débarrasser de l'espace parce que les codes seront ensuite utilisés dans la logique de l'application pour les comparaisons et quoi d'autre. En ce qui concerne la longueur moyenne du code, difficile à dire exactement. Supposons que tous les codes ont une longueur aléatoire entre un et dix. Editer: Une estimation approximative est d'environ 4,7 caractères pour la longueur moyenne d'un code.

+1

essayez de courir: 'SELECT AVG (LEN (CODE) * 1.0) FROM YourTable' –

+0

Bonne idée. Les codes sont étalés sur de nombreuses tables de codes, mais le résultat de la table de codes la plus populaire est 4.74 – macca1

Répondre

6

Je voterais pour varchar.

Je dis que varchar pour éviter le TRIM qui invaliderait l'utilisation de l'index (à moins que vous n'utilisiez une colonne calculée, ce qui va à l'encontre du but, non?).

Sinon, à une longueur de 10, ce serait 50/50 mais TRIM fait pencher la balance vers varchar et l'emporte sur la prestation de longueur fixe

+0

pourquoi utiliser TRIM? –

+1

Cuz le gars parle d'utiliser char au lieu de varchar –

+0

@KM: une comparaison de colonne char avec un littéral varchar convertira la colonne en varchar (priorité de type de données). Ensuite, vous aurez besoin de l'ajuster. Ou CAST le littéral à char. Quoi qu'il en soit, il est plus simple d'utiliser varchar pour garder le code plus simple – gbn

0

Dans un vieux livre je lis qu'en général omble chevalier est un meilleur choix quand pour la plupart des enregistrements la longueur réelle de la chaîne est d'au moins 60% du maximum; dans votre exemple - si plus de la moitié de tous les enregistrements ont une longueur de 6 ou plus. Sinon, utilisez varchar.

+0

Je suspecterais des déclarations générales comme ça simplement parce qu'elles font des suppositions sur la plate-forme. ces éléments auraient pu être optimisés ou les raisons d'indisponibilité changées dans une mise à jour mineure de la version. Par exemple, il était plus rapide dans Oracle de faire un COUNT (1) que COUNT ([star]). Combien de temps faudrait-il à Oracle pour que COUNT ([star]) soit aussi rapide que COUNT (1)? Deux lignes de code? Donc, des choses comme ça devraient être suspectes à long terme. –

+0

Désolé, dans le commentaire ci-dessus, je ne sais pas comment échapper au caractère astérisque –

1

Vos exigences sont une définition de manuel de quelqu'un qui doit utiliser varchar.

Si vous voulez vous soucier des performances, vous vous souciez de la conception de la base de données et de la qualité de l'écriture SQL. Les internes de Char vs VarChar sont bien optimisés par les fournisseurs de DB.

2

Je suis confiant que vous ne seriez pas capable de dire une différence de vitesse entre les deux.

+0

Oh oui, vous le ferez. 10 octets contre 6.7 longueur moyenne (4.7 + longueur) sur 1M lignes donne 3.3Mb moins d'espace mémoire consommé, 3.3Mb moins de données à lire et à écrire, 3.3Mb moins de journaux à écrire, les sauvegardes sont plus petites avec 3.3Mb etc etc –

+0

Je préfère le formel (TimeToComparePerformanceCosts * HourlyRateOfPerson)> = (PerformanceSavings% * HourlyRateOfHardwareCosts) – Nat

3

En règle générale, privilégiez toujours un stockage plus petit par rapport à un processeur supplémentaire. Étant donné que le facteur déterminant de la performance de la base de données est toujours E/S et que les enregistrements de données sont plus petits, cela signifie plus d'enregistrements par page, ce qui signifie moins de demandes d'E/S. Le processeur supplémentaire impliqué dans la gestion de la longueur variable ne va pas être un facteur. Historiquement, dans l'âge sombre des années 80 et même dans les années 90, il peut avoir été un facteur mesurable, mais aujourd'hui, c'est juste du bruit. Parce que le CPU et l'accès à la mémoire ont considérablement augmenté, mais la vitesse d'E/S est restée à peu près constante. C'est pourquoi les conseils «vieux livres» ne s'appliquent pas aujourd'hui. Sauf si vous avez un champ constant comme char (2) ou similaire, utilisez simplement varchar, toujours.

Questions connexes