La réponse spécifique à votre question (au moins pour Oracle et probablement d'autres bases de données) est que la longueur du champ n'a pas d'importance, seulement la longueur des données. Cependant, cela ne doit pas être utilisé comme facteur déterminant pour définir si le champ doit avoir sa longueur maximale autorisée ou non. Voici quelques autres problèmes que vous devriez considérer avant de maximiser la taille des champs.
Formatage
Tout outil client qui formate les données en fonction de la taille des champs nécessitera des considérations de formatage spéciales. Par exemple, SQL * Plus d'Oracle affiche par défaut la taille maximale des colonnes Varchar2 même si les données ne comportent qu'un caractère. Comparer…
create table f1 (a varchar2(4000), b varchar2(4000));
create table f2 (a varchar2(5), b varchar2(5));
insert into f1 values ('a','b');
insert into f2 values ('a','b');
select * from f1;
select * from f2;
La
longueur du champ de données incorrectes fournit un mécanisme supplémentaire pour intercepter / empêcher les données incorrectes. Une interface ne doit pas tenter d'insérer 3000 caractères dans un champ de 100 caractères, mais si ce champ est défini comme étant de 4000 caractères, c'est possible. L'erreur ne serait pas détectée à l'étape de la saisie des données, mais le système peut avoir des problèmes plus bas lorsqu'une autre application essaie de traiter les données et les étranglements. Par exemple, si vous décidez ultérieurement d'indexer le champ dans Oracle, vous dépasserez la longueur de clé maximale (selon la taille du bloc et la concaténation). Voir…
create index i1 on f1(a);
Mémoire
Si l'application cliente alloue de la mémoire en utilisant la taille maximale, l'application allouerait beaucoup plus de mémoire que nécessaire. Il faudrait prendre des précautions particulières pour éviter cela.
Documentation
La taille du champ fournit un autre point de données de documentation sur les données. Nous pourrions appeler toutes les tables t1, t2, t3, etc. et tous les champs f1, f2, f3, etc., mais en spécifiant des noms significatifs, nous comprenons mieux les données. Par exemple, si une table d'adresses pour une entreprise avec des clients aux États-Unis a un champ appelé État qui est de deux caractères, nous nous attendons à ce que l'abréviation d'état à deux caractères y soit incluse. D'un autre côté, si le champ comporte une centaine de caractères, nous pouvons nous attendre à ce que le nom complet de l'état soit inscrit dans le champ.
Cela dit, il semble prudent de se préparer au changement. Ce n'est pas parce que tous les noms de vos produits contiennent aujourd'hui 20 caractères qu'ils le seront toujours. N'exagérez pas et ne faites pas 1000, mais laissez de la place pour une expansion plausible.
Voici un bon point de départ pour vous.
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx
J'ai peut-être mal compris votre question initiale. Laissez-moi voir si je peux vous trouver quelques autres liens pour référence.
Voici une bonne référence sur les sélections de types de données: http://sqlfool.com/2009/05/performance-considerations-of-data-types/
Passer de varchar (20) à varchar (30) peut sembler quelque chose de petit, mais vous devez en savoir plus sur le fonctionnement des structures de base de données afin d'être conscient des problèmes potentiels. Par exemple, aller à varchar (30) pourrait vous pousser au-delà du point de basculement de vos colonnes (si les 30 octets sont utilisés) pouvant être stockés sur une page (moins de 8060 octets). Cela entraînera une augmentation de l'espace disque utilisé, une diminution des performances et même une surcharge supplémentaire avec vos journaux de transactions.
Voici un lien pour les structures de base de données: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx
En voici un pour les fractionnements de page et la journalisation trx: http://sqlskills.com/BLOGS/PAUL/post/How-expensive-are-page-splits-in-terms-of-transaction-log.aspx
HTH
la source
Je pensais partager un autre point intéressant, que j'ai trouvé dans la question SO suivante:
/programming/148398/are-there-any-disadvantages-to-always-using-nvarcharmax
Réponse originale de: Nick Kavadias
Je considérerais cela comme un gros inconvénient lors de l'ajout arbitraire de colonnes n / varchar (max), et selon le site MS, cette restriction contre les reconstructions d'index en ligne reste dans SQL Server 2008, 2008 R2 et Denali; il n'est donc pas spécifique à SQL Server 2005.
Merci, Jeff
la source
Dans certains cas, la quantité d'espace que vous allouez pour un champ varchar affectera la quantité de mémoire allouée pour les tris en mémoire.
J'ai trouvé les présentations sur SQLWorkshops.com stimulantes, cette présentation parle d'un cas où un tri pour une commande déborde dans tempdb car il n'y a pas assez de mémoire allouée pour les champs char / varchar.
http://webcasts2.sqlworkshops.com/webcasts.asp
Cette webémission a également été présentée sous forme d'article sur le site Web suivant:
http://www.mssqltips.com/tip.asp?tip=1955
Notez dans cette présentation que la colonne en cours de tri n'est pas la colonne char / varchar, mais la quantité d'espace allouée à la colonne varchar en mémoire fait une différence dans les performances de la requête dans certains cas.
la source
SET ANSI_PADDING ON?
Vous vous retrouvez avec beaucoup d'espaces de fuite ...
la source
Il ne concerne que l'espace disque et la longueur des caractères. Bien sûr, la recherche sur les types de données char et les index sur ces types de données agira plus lentement que l'entier, mais c'est une autre discussion.
Le type de données Varchar est un type de données "variable". Si vous définissez une limite de varchar (500), il s'agit de la longueur maximale de caractères pour ce champ. La longueur minimale peut être comprise entre 0 et 500. En revanche, l'espace disque revendiqué sera différent pour les champs de 10, 30 ou 500 caractères.
J'ai parfois fait un test pour le type de données varchar (800) et pour les valeurs nulles, j'avais 17 octets utilisés, et pour chaque caractère inséré, il a ajouté un octet de plus. Par exemple, une chaîne de 400 caractères avait 417 octets utilisés sur le disque.
la source
Je ne pense pas qu'il y ait une différence entre les tables créées avec des colonnes de varchar (20) ou varchar ((8000), tant que la longueur maximale réelle est <= 20.
D'un autre côté, dans certains cas, donner aux utilisateurs la possibilité de stocker des chaînes plus longues pourrait les encourager à le faire.
la source