Pourquoi ne pas utiliser de type varchar(max)?
Je suis un peu vieille école quand il s'agit de conception de base de données, donc je suis totalement pour l'utilisation de la bonne taille des données dans des colonnes. Cependant, lors de l'examen d'une base de données pour un ami, j'ai remarqué qu'il a utilisé varchar(max)
beaucoup. Maintenant, j'ai aussitôt pensé à jeter en arrière pour lui et de lui dire de le changer. Mais ensuite j'ai pensé à ce sujet et je ne pouvais pas trouver une bonne raison pour lui de ne pas l'utiliser (il avait utilisé un cas type d'outil pour générer la base de données, si vous vous poseriez la question).
J'ai fait des recherches sur le thème de la varchar(max)
d'utilisation et je ne peux pas réellement une bonne raison pour lui de ne pas l'utiliser.
Il n'utilise pas les colonnes pour les index, l'application qui se trouve sur la db a des limites à l'entrée, afin de ne pas permettre massive des entrées dans les champs.
Toute aide serait appréciée pour m'aider à lui faire voir la lumière :).
- Voir cette réponse pour une autre raison stackoverflow.com/questions/2009694/...
- C'est intéressant! dommage je ne l'ai pas trouvé plus tôt. merci!
- Pour l'un: vous ne pouvez pas mettre un index sur un
VARCHAR(MAX)
colonne... qui, seule, rend-moi de l'utiliser uniquement lorsque cela est absolument nécessaire.... - Je wil remarquer que s'attendre à l'application de contrôler l'entrée est stupide. Les données seront presque alawys survivre à l'application et à la prochaine version de l'application peut ne pas avoir la bonne limite.
Vous devez vous connecter pour publier un commentaire.
Ma réponse à cette question, n'est-ce pas à propos de l'utilisation de Max, autant qu'il est à propos de la raison pour VARCHAR(max) vs TEXTE.
Dans mon livre; tout d'abord, Sauf si vous pouvez être absolument certain que vous ne serez jamais à coder quelque chose, mais le texte anglais et les gens de ne pas se référer à des noms de certains endroits à l'étranger, alors vous devriez utiliser NVARCHAR ou NTEXT.
Deuxièmement, c'est ce que les champs vous permettent de le faire.
TEXTE est difficile à mettre à jour en comparaison à VARCHAR, mais vous obtenez l'avantage de l'Indexation de Texte Intégral et beaucoup de choses intelligentes.
D'autre part, VARCHAR(MAX) a une certaine ambiguïté, si la taille de la cellule est < 8000 caractères, il sera traité comme données de la Ligne. Si il est plus grand, il sera considéré comme un MÉTIER à des fins de stockage.
Parce que vous ne pouvez pas savoir ce sans interroger RBAR, ce qui peut avoir des stratégies d'optimisation pour les endroits où vous devez être sûr de vos données et le nombre de lectures qu'il en coûte.
Sinon, si votre utilisation est relativement banal et vous ne vous attendez pas à avoir des problèmes avec la taille des données (c'est à dire que vous utilisez .Net et n'ont donc pas à être préoccupés par la taille de votre chaîne/char* objets) puis à l'aide de type VARCHAR(max) c'est bien.
text
type de données. Ce n'est pas le cas.text
est un type de données obsolète et n'a aucun avantage survarchar(max)
autant que je sache.Il y a un blog post sur pourquoi ne pas utiliser varchar max ici
Modifier
La différence fondamentale est l'endroit où sont stockées les données. En SQL, la ligne de Données a une taille maximale de 8000 octets (ou était-ce 8K). Puis un 2 go de type varchar(max) ne peuvent pas être stockées dans la ligne de données. SQL Server stocke "Hors ligne".
Par conséquent, vous pourriez obtenir un gain de performance puisque les données ne seront pas au même endroit sur le disque, voir: http://msdn.microsoft.com/en-us/library/ms189087.aspx
Si vous travaillez dans un environnement OLTP, vous êtes tous sur la performance. Par le dessus et le réglage des préoccupations de l'indexation des limitations de requête et de goulots d'étranglement. À l'aide d'un varcahr(max) ou tout autre MÉTIER de type sera plus susceptible de contrevenir à la plupart de la conception des meilleures pratiques, de sorte que si il y a un besoin métier spécifique qui ne peuvent pas être traitées par le biais de certains autres tapant mécanisme et seulement un varchar(max) adapter le projet de loi, alors pourquoi l'objet de votre système et d'applications pour le type de charge et de performance inhérents à l'un des types de données LOB?
En revanche, si vous travaillez dans un environnement OLAP ou dans un Schéma en Étoile environnement DW avec les tables de Dimension avec les descripteurs de champs qui ont naturellement besoin d'être commentée puis un varchar(max), aussi longtemps que vous n'êtes pas en ajoutant que pour un indice, peut être utile. Je recommanderais même alors d'utiliser un char(x) varchar(x), Car il est toujours recommandé d'utiliser uniquement les ressources que vous devez absolument avoir pour faire le travail.
Ils ne devraient PAS être utilisés, sauf si vous vous attendez à de grandes quantités de données et en voici la raison pour laquelle (directement à partir de la documentation en Ligne):
Si vous voulez paralyser les performances, utilisez le type de données nvarchar pour tout.
WHERE
sauf peut-être pour vérifierIS NULL
?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
une bonne conception si pas les avantages de performance, et parce que VARCHAR(MAX)
les données ne compresse pas les
sera relativement lente, mais la différence pour une seule transaction
ne sera probablement pas mesurable.
sera plus rapide que si la table est mise pour stocker des données hors-ligne.
jusqu'à ce que les cordes sont très longues.
Je ne sais pas comment sql server gère un grand (déclaré) varchar des champs de la performance, de la mémoire et de stockage de point de vue.. mais en supposant qu'il le fait de manière aussi efficace que de petits déclaré champs varchar, il y a encore l'avantage de contraintes d'intégrité.
L'application assis sur le db est censé avoir des limites sur l'entrée, mais la base de données peuvent correctement un message d'erreur si la requête a un bug à ce sujet.
VARCHAR(MAX)
avec les comparaisons et dans leWHERE
clause. Le cas d'utilisation je m'attend pourVARCHAR(MAX)
est quelque chose que vous n'auriez pas de comparer ou d'WHERE
dans SQL—par exemple, un blog de contenu blob, un texte libre description de quelque chose. Si vous voulez comparer ouWHERE
, puis, bien sûr, contraignant aidera. Son exemple de'abc'
pourrait même être traduit en une comparaison de deux nombres entiers. Ce n'est pas le genre de données que l'on met dans unVARCHAR(MAX)
...La diff est en suivant:
VARCHAR(X)
peuvent être indexés et stockés dans leMDF/NDF
fichier de données.VARCHAR(MAX)
ne peuvent pas être indexés en raison peut atteindre un volume élevé et seront ensuite stockés comme séparés du fichier et non pas dans leMDF/NDF
fichier de données.Il est un peu vieux jeu à croire que le demande de transmettre uniquement des chaînes courtes à la base de données, et qui en feront bon.
Dans les temps modernes, vous ONT attendre à ce que la base de données sera accessible principalement par l'application en cours, mais il y a peut être une future version de l'application, le développeur de la version savoir rester des chaînes en dessous d'une certaine longueur?)
Vous DOIT prévoir que les services web, ETL processus, LYNC pour SQL, et d'autres déjà existants, et/ou ne sont pas encore des technologies existantes sera utilisé pour accéder à votre base de données.
en règle générale, j'essaie de ne pas aller sur varchar(4000), parce que c'est quatre mille caractères, après tout. Si je dépasse, puis je regarde d'autres types de données pour stocker tout ce que je suis en train de magasin. Brent Ozar a écrit quelques jolies great stuff sur ce.
Tout cela étant dit, il est important d'évaluer la actuel la conception de l'approche de votre actuel exigences lorsque vous travaillez sur un projet. Avoir une idée de la façon dont les différentes parties du travail, de comprendre les avantages et les inconvénients de différentes approches et de résoudre le problème à la main. L'exercice de certains grands axiome peut entraîner respect aveugle de ce qui pourrait vous transformer en un lemming.