web-dev-qa-db-fra.com

Pourquoi ne pas utiliser varchar (max)?

Je suis un peu vieux jeu en matière de conception de base de données, donc je suis tout à fait pour utiliser les tailles de données correctes en colonnes. Cependant, lors de l'examen d'une base de données pour un ami, j'ai remarqué qu'il utilisait beaucoup varchar(max). Maintenant, ma pensée immédiate était de le lui renvoyer et de lui dire de le changer. Mais ensuite, j'y ai réfléchi et je ne pouvais pas lui trouver une bonne raison de ne pas l'utiliser (il avait utilisé un outil de type de cas pour générer la base de données, si vous vous le demandiez).

J'ai étudié le sujet de l'utilisation de varchar(max) et je ne peux pas vraiment lui donner de bonne raison de ne pas l'utiliser.

Il n'utilise pas les colonnes pour les index, l'application qui repose sur la base de données a des limites sur les entrées, elle ne permet donc pas des entrées massives dans les champs.

Toute aide serait appréciée pour m'aider à lui faire voir la lumière :).

69
AtaLoss

Ma réponse à cette question ne concerne pas l'utilisation de Max, mais plutôt la raison de VARCHAR (max) vs TEXT.

Dans mon livre Tout d'abord, à moins que vous ne soyez absolument certain de ne jamais encoder autre chose que du texte anglais et que les gens ne se réfèrent pas à des noms d'emplacements étrangers, vous devez utiliser NVARCHAR ou NTEXT.

Deuxièmement, c’est ce que les champs vous permettent de faire.

TEXT est difficile à mettre à jour par rapport à VARCHAR, mais vous bénéficiez de l’indexation de texte intégral et de nombreuses autres choses astucieuses.

D'autre part, VARCHAR (MAX) présente une certaine ambiguïté. Si la taille de la cellule est <8 000 caractères, elle sera traitée comme une donnée de ligne. S'il est supérieur, il sera traité en tant que LOB à des fins de stockage . Parce que vous ne pouvez pas le savoir sans interroger RBAR, cela peut avoir des stratégies d'optimisation pour les endroits où vous devez être sûr de vos données et combien de celles-ci lisent frais.

Sinon, si votre utilisation est relativement banale et que vous ne vous attendez pas à avoir des problèmes de taille de données (par exemple, vous utilisez .Net et vous n'avez donc pas à vous soucier de la taille de vos objets string/char *) puis utiliser VARCHAR (max) est correct.

33
Russ Clarke

Il y a un article de blog sur pourquoi ne pas utiliser varchar max ici

Modifier

La différence fondamentale est l'endroit où les données sont stockées. Une ligne de données SQL a une taille maximale de 8 000 octets (ou était-ce 8 Ko). Ensuite, un varchar (max) de 2 Go ne peut pas être stocké dans la ligne de données. SQL Server le stocke "Hors ligne".

Par conséquent, vous pourriez avoir un problème de performance car les données ne seront pas au même endroit sur le disque, voir: http://msdn.Microsoft.com/en-us/library/ms189087.aspx

13
Shiraz Bhaiji

Si vous travaillez dans un environnement OLTP, vos performances sont primordiales. De la surcharge et des problèmes d’ajustement aux limitations d’indexation et aux goulots d’étranglement des requêtes. L'utilisation d'un varcahr (max) ou de tout autre type d'objet LOB va probablement contrevenir à la plupart des meilleures pratiques de conception. Par conséquent, sauf en cas de besoin commercial spécifique ne pouvant pas être géré par un autre mécanisme de dactylographie, seul un varchar (max) convient. Pourquoi alors soumettre votre système et vos applications au genre de problèmes de performances et de frais généraux inhérents à l’un des types de données LOB?

Par contre, si vous travaillez dans un environnement OLAP ou dans un environnement Star Schema DW avec des tables de dimension avec des champs de descripteurs qui doivent naturellement être commentés, utilisez un varchar (max), tant que vous ne l'ajoutez pas. à un index, peut être utile. Néanmoins, je recommanderais quand même d'utiliser un caractère (x) varchar (x), car il est toujours recommandé de n'utiliser que les ressources dont vous avez absolument besoin pour faire le travail.

2
Scott Johnston

Ils ne doivent PAS être utilisés sauf si vous vous attendez à de grandes quantités de données et voici pourquoi (directement à partir de Books Online):

Colonnes des types de données LOB (Large Object) ntext, text, varchar (max), nvarchar (max), varbinary (max), xml ou image ne peuvent pas être spécifié en tant que colonnes de clé pour un index.

Si vous souhaitez paralyser les performances, utilisez nvarchar pour tout.

1
HLGEM

Je ne sais pas comment le serveur SQL gère les champs varchar (déclarés) volumineux du point de vue des performances, de la mémoire et du stockage.

L’application située sur la base de données est supposée avoir des limites d’entrée, mais la base de données peut correctement signaler une erreur si l’application a un bogue à cet égard.

0
at.

Il est un peu démodé de croire que l'application ne transmettra que des chaînes courtes à la base de données, ce qui la rendra correcte.

Dans les temps modernes, vous DEVEZ prévoir que la base de données sera principalement utilisée par l'application actuelle, mais il est possible qu'une version future de l'application soit disponible (le développeur de cette version saura-t-il conserver les chaînes en dessous d'un certaine longueur?)

Vous DEVEZ prévoir que des services Web, des processus ETL, de LYNC vers SQL et tout autre nombre de technologies déjà existantes et/ou non encore existantes seront utilisés pour accéder à votre base de données.

En général, j'essaie de ne pas passer par dessus varchar (4000), parce que c'est quatre mille caractères, après tout. Si je dépasse cette limite, je me tourne vers d'autres types de données pour stocker ce que j'essaie de stocker. _ { Brent Ozar } _ a écrit de jolies bonnes choses sur ce sujet.

Cela étant dit, il est important d'évaluer l'approche de la conception actuelle en ce qui concerne vos exigences actuelles lorsque vous travaillez sur un projet. Ayez une idée du fonctionnement des différentes parties, comprenez les compromis des différentes approches et résolvez le problème. Exercer un grand axiome peut conduire à une adhésion aveugle qui pourrait vous transformer en un lemming .

0
Stephen Lauzon

Le diff est dans le suivant:
VARCHAR(X) peut être indexé et stocké dans le fichier de données MDF/NDF.
VARCHAR(MAX) ne peut pas être indexé car peut atteindre un volume élevé et sera ensuite stocké sous forme de fichier séparé et non dans le fichier de données MDF/NDF.

0
Vlad Kirov

Redgate a écrit un excellent article à ce sujet.
https://www.red-gate.com/simple-talk/sql/database-administration/whats-the-point-of-using-varcharn-anymore/

Conclusions 

  • Le cas échéant, utilisez VARCHAR (n) sur VARCHAR (MAX) pour des raisons de qualité, de conception, sinon de performances optimales, et parce que les données VARCHAR (MAX) .__ ne se compressent pas. 
  • Stocker de grandes chaînes prend plus de temps que de stocker de petites chaînes.
  • La mise à jour d'une valeur VARCHAR (MAX) dans la ligne de moins de 8 000 à plus de 8 000 Sera relativement lente, mais la différence pour une transaction unique Ne sera probablement pas mesurable.
  • La mise à jour d'une valeur VARCHAR (MAX) dans la ligne de plus de 8 000 à moins de 8 000 Sera plus rapide que si la table est configurée pour stocker les données hors ligne.
  • L'utilisation de l'option hors ligne pour VARCHAR (MAX) ralentit l'écriture Jusqu'à ce que les chaînes soient très longues.
0
Donny V.