Aucun SGBD que je connaisse n'a d'"optimisation" qui rendra une VARCHAR
avec un 2^n
sont plus performants que ceux qui ont une longueur max
longueur qui n'est pas une puissance de 2.
Je pense que les premières versions de SQL Server traitaient en fait un VARCHAR
avec la longueur 255 différemment de celle avec une longueur maximale plus élevée. Je ne sais pas si c'est toujours le cas.
Pour la quasi-totalité des SGBD, l'espace de stockage réellement nécessaire est uniquement déterminé par le nombre de caractères que vous y mettez, et non par la taille de la base de données. max
longueur que vous définissez. Ainsi, du point de vue du stockage (et très probablement aussi du point de vue des performances), il n'y a aucune différence si vous déclarez une colonne en tant que VARCHAR(100)
ou VARCHAR(500)
.
Vous devriez voir le max
longueur prévue pour un VARCHAR
comme une sorte de contrainte (ou de règle de gestion) plutôt que comme un élément technique/physique.
Pour PostgreSQL, la meilleure configuration est d'utiliser text
sans restriction de longueur et un CHECK CONSTRAINT
qui limite le nombre de caractères à ce que votre entreprise exige.
Si cette exigence change, la modification de la contrainte de contrôle est beaucoup plus rapide que la modification de la table (car la table ne doit pas être réécrite).
La même chose peut s'appliquer à Oracle et à d'autres - dans le cas d'Oracle, ce serait VARCHAR(4000)
au lieu de text
cependant.
Je ne sais pas s'il y a une différence de stockage physique entre VARCHAR(max)
et par exemple VARCHAR(500)
dans SQL Server. Mais apparemment, il y a un impact sur les performances lorsque l'on utilise varchar(max)
par rapport à varchar(8000)
.
Voir ce lien (posté par Erwin Brandstetter en tant que commentaire)
Edition 2013-09-22
En ce qui concerne le commentaire de Bigown :
Dans les versions de Postgres antérieures à 9.2 (qui n'était pas disponible lorsque j'ai rédigé la réponse initiale), une modification de la définition de la colonne a fait réécrire l'ensemble du tableau, voir par exemple ici . Depuis la version 9.2, ce n'est plus le cas et un test rapide a confirmé que l'augmentation de la taille des colonnes pour une table de 1,2 million de lignes ne prenait que 0,5 seconde.
Pour Oracle, cela semble également vrai, si l'on en juge par le temps qu'il faut pour modifier les données d'une grande table. varchar
colonne. Mais je n'ai pu trouver aucune référence à ce sujet.
Pour MySQL le manuel dit " Dans la plupart des cas, ALTER TABLE
fait une copie temporaire de la table originale ". Et mes propres tests le confirment : l'exécution d'un ALTER TABLE
sur une table de 1,2 million de lignes (la même que dans mon test avec Postgres) pour augmenter la taille d'une colonne a pris 1,5 minutes. Dans MySQL cependant, vous pouvez pas utilisez la "solution de contournement" pour utiliser une contrainte de contrôle afin de limiter le nombre de caractères dans une colonne.
Pour SQL Server, je n'ai pas pu trouver de déclaration claire à ce sujet, mais le temps d'exécution pour augmenter la taille d'une base de données est plus long. varchar
(à nouveau le tableau de 1,2 million de lignes ci-dessus) indique que pas de la réécriture a lieu.
Modifier 2017-01-24
Il semble que j'avais (au moins partiellement) tort à propos de SQL Server. Voir cette réponse d'Aaron Bertrand qui montre que la longueur déclarée d'un nvarchar
ou varchar
Les colonnes font une énorme différence pour les performances.