Aucun SGBD que je connais n'a d '"optimisation" qui rendrait un VARCHAR
avec une 2^n
longueur plus performant qu'un avec une max
longueur qui n'est pas une puissance de 2.
Je pense que les premières versions de SQL Server traitaient en réalité une VARCHAR
longueur 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 max
longueur 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 max
longueur fournie pour une VARCHAR
colonne 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 text
sans restriction de longueur et CHECK CONSTRAINT
qui 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 text
bien.
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 varchar
colonne 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 TABLE
crée une copie temporaire de la table d'origine ". Et mes propres tests confirment que: exécuter un ALTER TABLE
sur 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 varchar
colonne (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 nvarchar
ou de varchar
colonnes fait une énorme différence pour la performance.