2009-05-07 11 views
164

Je viens de lire que le type de données VARCHAR(MAX) (qui peut stocker près de 2 Go de données char) est le remplacement recommandé pour le type de données TEXT dans les versions SQL Server 2005 et Next SQL SERVER.Utilisation de varchar (MAX) vs TEXT sur SQL Server

Si je veux rechercher une chaîne à l'intérieur d'une colonne, quelle opération est la plus rapide?

  1. En utilisant une clause LIKE contre une colonne VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. En utilisant la colonne TEXT et mettre un Index Texte intégral/Catalogue sur cette colonne, et la recherche puis en utilisant la clause CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

+1

Ce poste est également utile: http://stackoverflow.com/questions/564755/sql-server-text-type-vs-varchar-data-type – Jake

+21

La mention la plus importante dans ce poste est un lien vers [documentation MSDN] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) montrant que 'TEXT' et' NTEXT' (et 'IMAGE') sont obsolètes. – Brian

+0

Regardez le lien: http://stackoverflow.com/q/28980502/1805776 – vicky

Répondre

271

Le VARCHAR(MAX) t ype est un remplacement pour TEXT. La différence fondamentale est qu'un type TEXT stockera toujours les données dans un blob alors que le type VARCHAR(MAX) tentera de stocker les données directement dans la ligne à moins qu'il ne dépasse la limite de 8k et à ce moment il les stocke dans un blob.

L'utilisation de l'instruction LIKE est identique entre les deux types de données. La fonctionnalité supplémentaire VARCHAR(MAX) vous donne est qu'il peut également être utilisé avec = et GROUP BY comme toute autre colonne VARCHAR peut être. Cependant, si vous avez beaucoup de données, vous aurez un énorme problème de performance en utilisant ces méthodes.

En ce qui concerne si vous devez utiliser LIKE pour rechercher, ou si vous devez utiliser Texte intégral indexation et CONTAINS. Cette question est la même indépendamment de VARCHAR(MAX) ou TEXT.

Si vous recherchez une grande quantité de texte et que les performances sont importantes, vous devez utiliser un index de texte intégral.

LIKE est plus simple à mettre en œuvre et convient souvent pour de petites quantités de données, mais il a des performances extrêmement médiocres avec de grandes données en raison de son incapacité à utiliser un index.

+10

Je ne savais pas qu'il serait stocké dans la page à 8k, et hors de la page si elle est plus grande. Très sympa. – Brain2000

+3

Votre dernière ligne est partiellement erronée. LIKE ne peut pas utiliser index UNIQUEMENT si le caractère générique est au début de la chaîne recherchée. – SouravA

+0

N'est-ce pas un problème de modifier un champ d'un texte en un varchar (max) d'une table existante avec des données? – user1531040

17

Pour le grand texte, l'index de texte intégral est beaucoup plus rapide. Mais vous pouvez aussi index de texte completvarchar(max) ainsi.

14

Vous ne pouvez pas rechercher un champ de texte sans le convertir du texte en varchar.

declare @table table (a text) 
insert into @table values ('a') 
insert into @table values ('a') 
insert into @table values ('b') 
insert into @table values ('c') 
insert into @table values ('d') 


select * 
from @table 
where a ='a' 

Cela donne une erreur:

The data types text and varchar are incompatible in the equal to operator. 

wheras cela ne:

declare @table table (a varchar(max)) 

Fait intéressant, LIKE fonctionne toujours, à savoir

where a like '%a%' 
+9

+1 juste pour dire downvote aléatoire! Ça me rend fou quand les gens me déprécient et n'ont aucun commentaire, ils ont vraiment besoin d'une vie. –

+2

La raison pour laquelle il a eu des downvotes est que ** d'après ce que je me souviens des choses que j'ai dû faire ** n'est pas un argument valable à apporter quand je réponds à une question technique. Pensez aux gens (comme moi en ce moment) qui essaient de comprendre pourquoi devrions-nous utiliser 'varchar (n)' ou 'text', et passer outre cette réponse. Pensez-vous que, dans un environnement professionnel, argumenter avec des déclarations vagues aidera à résoudre le problème? Tous les posts sur StackOverflow sont destinés à être vus par des milliers de personnes, agissent en conséquence! –

+2

@Zeratops lol, cette réponse a 6 ans, j'étais plutôt vert à l'époque quand je l'ai écrit. J'ai nettoyé le libellé pour être plus précis. – DForck42

4

Si vous utilisez MS Access (versions en particulier plus anciens comme 2003), vous êtes obligé d'utiliser TEXT type de données sur SQL Server en tant que MS Access ne reconnaît pas nvarchar(MAX) comme un champ Mémo dans Access, alors que TEXT est reconnu comme un champ Mémo .

7
  • Définition de base

TEXT et VarChar(MAX) sont non-Unicode grand caractère de longueur variable type de données, qui peut stocker un maximum de 2147483647 caractères non Unicode (à savoir la capacité de stockage maximale est: 2 Go).

  • Lequel utiliser?

Comme par MSDN link Microfost est ce qui suggère d'éviter d'utiliser le type de données texte et seront supprimées dans une version future de Sql Server. Varchar (Max) est le type de données suggéré pour stocker les grandes valeurs de chaîne au lieu du type de données Texte.

  • En-ligne ou le stockage hors-ligne

données d'une colonne de type Text est stockée hors ligne dans une pages de données LOB séparées. La ligne de la page de données du tableau ne comportera qu'un pointeur de 16 octets vers la page de données LOB où les données réelles sont présentes. Alors que les données d'une colonne de type Varchar(max) sont stockées dans la ligne si elles sont inférieures ou égales à 8000 octets. Si la valeur de la colonne Varchar (max) croise les 8000 octets, la valeur de la colonne Varchar (max) est stockée dans des pages de données LOB séparées et la ligne ne comportera qu'un pointeur de 16 octets vers la page de données LOB où les données réelles sont présentes. Donc In-Row Varchar (Max) est bon pour les recherches et la récupération.

  • pris en charge/Fonctionnalités non prises en charge

Certaines des fonctions de chaîne, les opérateurs ou les constructions qui ne fonctionne pas sur la colonne de type texte, mais ils travaillent sur VarChar (Max) Type de colonne .

  1. = égal à l'opérateur sur VarChar (Max) de type colonne
  2. groupe par clause sur VarChar (Max) de type colonne

    • système IO Considérations

Comme nous savons que les valeurs de colonne de type VarChar (Max) sont stocké hors ligne uniquement si la longueur de la valeur à stocker est supérieure à 8000 octets ou s'il n'y a pas assez d'espace dans la ligne, sinon il le stockera dans la ligne.Ainsi, si la plupart des valeurs stockées dans la colonne VarChar (Max) sont grandes et stockées hors ligne, le comportement de récupération de données sera presque similaire à celui de la colonne Type de texte. Mais si la plupart des valeurs stockées dans les colonnes de type VarChar (Max) sont suffisamment petites pour être stockées dans la rangée. Ensuite, la récupération des données où les colonnes LOB ne sont pas incluses nécessite le nombre de pages de données à lire lorsque la valeur de la colonne LOB est stockée dans la même page de données où les valeurs de colonne non-LOB sont stockées. Mais si la requête de sélection inclut une colonne LOB, elle nécessite moins de pages à lire pour la récupération de données par rapport aux colonnes de type Texte.

Conclusion

Utilisez VarChar(MAX) type de données plutôt que TEXT pour une bonne performance.

Source

Questions connexes