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.
varchar(max)
probablement plus à celui d'OracleCLOB
VARCHAR(255)
etVARCHAR(2)
prenez exactement la même quantité d'espace sur le disque! Donc, la seule raison de le limiter est si vous avez un besoin spécifique pour qu'il soit plus petit. Sinon, faites-les tous 255.Plus précisément, lors du tri, une colonne plus grande prend plus d'espace, donc si cela nuit aux performances, vous devez vous en préoccuper et les rendre plus petites. Mais si vous ne sélectionnez qu'une seule ligne dans ce tableau, vous pouvez simplement les faire toutes 255 et cela n'aura pas d'importance.
Voir: Quelles sont les tailles optimales de varchar pour MySQL?
la source
VARCHAR(MAX)
? L'espace n'est pas la seule considération lors de la modélisation d'une base de données. Le domaine que vous modélisez doit générer les types de données et les tailles.VARCHAR(MAX)
n'est pas identique àvarchar(255)
ouvarchar(65535)
- varchar max est un type de type detext
données. Et à votre point - s'il savait ce que le «domaine qu'il modélisait», il ne poserait pas cette question. De toute évidence, il ne sait pas quelle sera la taille de ses données, et je le rassure: le fait de le faire en taille réelle ne fait rien.(a,b,c,d)
index lorsque les quatre colonnes le sontVARCHAR(255)
.Chaque fois que je configure une nouvelle table SQL, je ressens la même chose à propos de 2 ^ n étant plus "pair" ... mais pour résumer les réponses ici, il n'y a pas d'impact significatif sur l'espace de stockage simplement en définissant varchar (2 ^ n) ou même varchar (MAX).
Cela dit, vous devez toujours anticiper les implications potentielles sur le stockage et les performances lors de la définition d'une limite varchar () élevée. Par exemple, supposons que vous créez une colonne varchar (MAX) pour contenir les descriptions de produits avec une indexation de texte intégral. Si 99% des descriptions ne comptent que 500 caractères, et que vous obtenez soudainement quelqu'un qui remplace lesdites descriptions par des articles wikipedia, vous remarquerez peut-être des résultats importants imprévus en termes de stockage et de performances.
Une autre chose à considérer de Bill Karwin :
Fondamentalement, venez avec des contraintes commerciales raisonnables et des erreurs sur une taille légèrement plus grande. Comme l'a souligné @onedaywhen, les noms de famille au Royaume-Uni comptent généralement entre 1 et 35 caractères. Si vous décidez de le faire varchar (64), vous n'allez vraiment rien faire de mal ... à moins que vous ne stockiez le nom de famille de ce type qui contiendrait jusqu'à 666 caractères. Dans ce cas, peut-être que varchar (1028) a plus de sens.
Et au cas où cela serait utile, voici à quoi pourraient ressembler varchar 2 ^ 5 à 2 ^ 10 s'il est rempli:
la source
La meilleure valeur est celle qui convient aux données telles que définies dans le domaine sous-jacent.
Pour certains domaines,
VARCHAR(10)
convient à l'Name
attribut, car d'autres domainesVARCHAR(255)
peuvent être le meilleur choix.la source
En ajoutant à la réponse de a_horse_with_no_name vous pourriez trouver ce qui suit d'intérêt ...
N'oubliez pas le ou les octets de longueur et l'octet nullable:
name varchar(100) not null
sera de 1 octet (longueur) + jusqu'à 100 caractères (latin1)name varchar(500) not null
sera de 2 octets (longueur) + jusqu'à 500 caractères (latin1)name varchar(65533) not null
sera de 2 octets (longueur) + jusqu'à 65533 caractères (latin1)name varchar(65532)
sera de 2 octets (longueur) + jusqu'à 65 532 caractères (latin1) + 1 octet nulJ'espère que cela t'aides :)
la source
Vérifiez toujours auprès de votre expert en domaine d'activité. Si c'est vous, recherchez une norme de l'industrie. Si, par exemple, le domaine en question est le nom de famille (nom de famille) d'une personne physique, pour une entreprise au Royaume - Uni, j'irais dans le catalogue des normes de données UK Govtalk pour obtenir des informations sur la personne et découvrir qu'un nom de famille comprendra entre 1 et 35 caractères. .
la source
Je n'ai pas vérifié cela récemment, mais je sais par le passé avec Oracle que le pilote JDBC réservait une partie de la mémoire lors de l'exécution de la requête pour conserver le jeu de résultats. La taille du bloc de mémoire dépend des définitions de colonne et de la taille d'extraction. La longueur des colonnes varchar2 affecte donc la quantité de mémoire réservée. Cela m'a causé de sérieux problèmes de performances il y a des années, car nous utilisions toujours varchar2 (4000) (le maximum à l'époque) et la collecte des ordures était beaucoup moins efficace qu'aujourd'hui.
la source
Dans un sens, vous avez raison, même si tout ce qui est inférieur à 2 ^ 8 caractères sera enregistré comme octet de données.
Si vous tenez compte du caractère de base qui laisse quoi que ce soit avec un VARCHAR <255 comme consommant la même quantité d'espace.
255 est une bonne définition de base, sauf si vous souhaitez particulièrement réduire les entrées excessives.
la source