Aucun SGBD que je connais n'a d '"optimisation" qui rendrait un VARCHARavec une 2^nlongueur plus performant qu'un avec une maxlongueur qui n'est pas une puissance de 2.
Je pense que les premières versions de SQL Server traitaient en réalité une VARCHARlongueur 255 différemment d'une longueur maximale plus élevée. Je ne sais pas si c'est toujours le cas.
Pour presque tous les SGBD, le stockage réel requis est uniquement déterminé par le nombre de caractères que vous y insérez, et non par la maxlongueur que vous définissez. Donc, du point de vue du stockage (et probablement aussi des performances), cela ne fait aucune différence que vous déclariez une colonne comme VARCHAR(100)ou VARCHAR(500).
Vous devriez voir la maxlongueur fournie pour une VARCHARcolonne comme une sorte de contrainte (ou de règle commerciale) plutôt que comme une chose technique / physique.
Pour PostgreSQL, la meilleure configuration consiste à utiliser textsans restriction de longueur et CHECK CONSTRAINTqui limite le nombre de caractères à tout ce dont votre entreprise a besoin.
Si cette exigence change, la modification de la contrainte de vérification est beaucoup plus rapide que la modification de la table (car la table n'a pas besoin d'être réécrite)
La même chose peut être appliquée pour Oracle et d'autres - dans Oracle, ce serait VARCHAR(4000)au lieu de textbien.
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 lors de l'utilisation varchar(max)par rapport à varchar(8000).
Voir ce lien (publié par Erwin Brandstetter en tant que commentaire)
Modifier 2013-09-22
Concernant le commentaire de bigown:
Dans les versions Postgres antérieures à 9.2 (qui n'étaient pas disponibles lorsque j'ai écrit la réponse initiale), une modification de la définition de colonne a réécrit tout le 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 un tableau de 1,2 million de lignes ne prenait en effet que 0,5 seconde.
Pour Oracle, cela semble également être vrai, à en juger par le temps qu'il faut pour modifier la varcharcolonne d' une grande table . Mais je n'ai pu trouver aucune référence pour cela.
Pour MySQL, le manuel dit " Dans la plupart des cas, ALTER TABLEcrée une copie temporaire de la table d'origine ". Et mes propres tests confirment que: exécuter un ALTER TABLEsur une table avec 1,2 million de lignes (le même que dans mon test avec Postgres) pour augmenter la taille d'une colonne a pris 1,5 minute. Dans MySQL, cependant, vous ne pouvez pas utiliser la "solution de contournement" pour utiliser une contrainte de vérification pour 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 varcharcolonne (encore une fois le tableau de 1,2 million de lignes ci-dessus) indique qu'aucune réécriture n'a lieu.
Modifier 2017-01-24
Semble que j'avais (au moins partiellement) tort sur SQL Server. Voir cette réponse d'Aaron Bertrand qui montre que la longueur déclarée d'une nvarcharou de varcharcolonnes fait une énorme différence pour la performance.