web-dev-qa-db-fra.com

Dois-je ajouter une limite de longueur arbitraire aux colonnes VARCHAR?

Selon documents de PostgreSQL , il n'y a pas de différence de performances entre VARCHAR, VARCHAR(n) et TEXT.

Dois-je ajouter une limite de longueur arbitraire à une colonne nom ou adresse?

Edit: Pas un dupe de:

Je sais que le type CHAR est une relique du passé et je m'intéresse non seulement aux performances mais aussi aux autres avantages et inconvénients comme Erwin l'a déclaré dans sa réponse étonnante.

41
Daniel Serodio

La réponse est non .
N'ajoutez pas de modificateur de longueur à varchar si vous pouvez l'éviter. La plupart du temps, vous n'avez de toute façon pas besoin d'une restriction de longueur. Utilisez simplement text pour toutes les données de caractères. Faites que varchar (pas de modificateur de longueur) si vous devez rester compatible avec les SGBDR qui n'ont pas text comme type de chaîne de caractères générique.

Les performances sont presque les mêmes - text est n peu plus rapide dans des situations rares , et vous enregistrez les cycles pour le contrôle de la longueur.

Si vous avez réellement besoin pour appliquer une longueur maximale, vous pouvez toujours utiliser text et ajouter une contrainte de vérification pour ça:

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);

Vous pouvez modifier ou supprimer une telle contrainte à tout moment sans avoir à vous soucier de la définition de la table et des objets dépendants (vues, fonctions, clés étrangères, ...)

Les modificateurs de longueur peuvent provoquer des problèmes tels que this ou this ou this ...

PostgreSQL 9.1 a introduit une nouvelle fonctionnalité pour alléger quelque peu la douleur. Les notes de version:

Autoriser ALTER TABLE ... SET DATA TYPE pour éviter les réécritures de table dans les cas appropriés (Noah Misch, Robert Haas)

Par exemple, la conversion d'une colonne varchar en texte ne nécessite plus de réécriture de la table. Cependant, l'augmentation de la contrainte de longueur sur une colonne varchar nécessite toujours une réécriture de table.

53
Erwin Brandstetter

Si vous voyez la limite de longueur comme une sorte de contrainte de vérification pour vous assurer de valider les données, alors oui, ajoutez-en une. En fait, vous voudrez peut-être pas utiliser une définition de longueur mais une vraie contrainte de vérification à la place, pour rendre changer la limite plus rapide.

Pour modifier (augmenter) une limite de longueur, vous devez exécuter un ALTER TABLE Qui peut prendre un certain temps (en raison d'une possible réécriture de la table) pendant lequel un verrouillage de table exclusif est nécessaire.

La modification (c'est-à-dire la suppression et la recréation) d'une contrainte de vérification est une opération très brève et ne nécessite que la lecture des données de la table, elle ne modifiera aucune ligne. Cela va donc être beaucoup plus rapide (ce qui signifie que le verrou exclusif de la table sera maintenu pendant une durée beaucoup plus courte).

Pendant le fonctionnement, il n'y a aucune différence entre une colonne text, varchar ou varchar(5000).

12

La question est précisément de savoir si en ajoutant une longueur arbitraire limite aux colonnes VARCHAR?

À cela, la réponse est simplement "non". Il n'y a rien qui puisse justifier l'ajout d'une limite arbitraire comme vous le feriez dans des bases de données inférieures qui prennent en charge varchar(max) ou utilisent des conventions comme varchar(255). Cependant, si la spécification adresse une limite, je pense que la réponse devient beaucoup plus complexe, en particulier sur les versions modernes de PostgreSQL. Et, pour cela, je pencherais vers [~ # ~] oui [~ # ~] .

À mon avis, la limite est un choix judicieux si la spécification l'exige. Surtout pour des charges de travail plus raisonnables. Si pour aucune autre raison, alors pour conserver les métadonnées.

D'après ma réponse ici, performances d'index pour CHAR vs VARCHAR (Postgres) , où j'aborde la valeur des métadonnées.

Si je trouvais une spécification qui avait des clés de texte de longueur variable qui étaient significatives et que je faisais confiance pour avoir une longueur maximale constante, j'utiliserais également varchar. Cependant, je ne vois rien qui corresponde à ces critères.

2
Evan Carroll

Il semble qu'il puisse y avoir une différence de performances si VARCHAR est régulièrement utilisé pour stocker de très grandes chaînes, car "les longues chaînes sont compressées automatiquement par le système" et "les valeurs très longues sont également stockées dans les tables d'arrière-plan". Théoriquement, cela signifierait qu'un volume élevé de demandes pour un champ de chaîne très long serait plus lent que pour un champ de chaîne court. Vous ne rencontrerez probablement jamais ce problème, car les noms et adresses ne seront pas très longs.

Cependant, selon la façon dont vous utilisez ces chaînes en dehors de votre base de données, vous souhaiterez peut-être ajouter une limite pratique pour éviter les abus du système. Par exemple, si vous affichez le nom et l'adresse sur un formulaire quelque part, vous ne pourrez peut-être pas afficher un paragraphe entier de texte dans le champ "nom", il serait donc judicieux de limiter la colonne de nom à quelque chose comme 500 personnages.

1
Edward