web-dev-qa-db-fra.com

Utilisation de varchar (MAX) vs TEXT sur SQL Server

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

Si je veux chercher une chaîne dans une colonne, quelle opération est la plus rapide?

  1. Utilisation de la clause LIKE contre une colonne VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. En utilisant la colonne TEXT, placez un index de texte intégral/Catalogue sur cette colonne, puis effectuez une recherche à l'aide de la clause CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

184
user85116

Le type VARCHAR(MAX) est un remplacement de TEXT. La différence fondamentale réside dans le fait 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, sauf si elles dépassent la limite de 8k et à ce stade, il stocke dans un blob.

L'utilisation de l'instruction LIKE est identique entre les deux types de données. La fonctionnalité supplémentaire que VARCHAR(MAX) vous donne est que vous pouvez également l'utiliser avec = et GROUP BY comme n'importe quelle autre colonne VARCHAR. Cependant, si vous avez beaucoup de données, l'utilisation de ces méthodes posera un problème de performances considérable.

Pour ce qui est de savoir si vous devez utiliser LIKE pour effectuer une recherche ou si vous devez utiliser Indexation de texte intégral et CONTAINS. Cette question est la même quels que soient VARCHAR(MAX) ou TEXT.

Si vous recherchez de grandes quantités de texte et que les performances sont essentielles, vous devez utiliser un Index de texte intégral.

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

298
Robin Day

Pour les textes de grande taille, le index de texte intégral est beaucoup plus rapide. Mais vous pouvez index de texte intégralvarchar(max)as bien.

17
Joel Coehoorn

Vous ne pouvez pas rechercher un champ de texte sans le convertir de 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.

Ce qui n'est pas le cas:

declare @table table (a varchar(max))

Fait intéressant, LIKE fonctionne toujours, c.-à-d.

where a like '%a%'
15
DForck42
  • Définition de base

TEXT et VarChar(MAX) sont des types de données caractère de grande longueur variable non-Unicode, qui peuvent stocker 2147483647 caractères maximum (la capacité de stockage maximale est de: 2 Go).

  • Lequel utiliser?

Conformément à lien MSDN , Microsoft suggère d'éviter d'utiliser le type de données Text et celui-ci sera supprimé dans les futures versions 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 Text.

  • Stockage en ligne ou hors ligne

Les données d'une colonne de type Text sont stockées hors ligne dans des pages de données LOB distinctes. La ligne de la page de données de la table aura uniquement un pointeur de 16 octets sur 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 en ligne si leur nombre est inférieur ou égal à 8 000 octets. Si la valeur de colonne Varchar (max) dépasse les 8 000 octets, la valeur de colonne Varchar (max) est stockée dans des pages de données LOB distinctes et la ligne ne comporte 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) convient aux recherches et à la récupération.

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

Certaines fonctions de chaîne, opérateurs ou constructions ne fonctionnent pas dans la colonne de type Texte, mais ils fonctionnent dans la colonne de type VarChar (Max).

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

    • Système IO Considérations

Comme nous savons que les valeurs de colonne de type VarChar (Max) sont stockées hors ligne uniquement si la longueur de la valeur à stocker est supérieure à 8 000 octets ou s'il n'y a pas assez d'espace dans la ligne, sinon elle sera stockée. il en ligne. Par conséquent, si la plupart des valeurs stockées dans la colonne VarChar (Max) sont volumineuses et stockées hors ligne, le comportement d'extraction des données sera presque similaire à celui de la colonne de type Texte.

Mais si la plupart des valeurs stockées dans les colonnes de type VarChar (Max) sont suffisamment petites pour être stockées en ligne. Ensuite, l'extraction des données pour lesquelles les colonnes LOB ne sont pas incluses nécessite le plus grand nombre de pages de données à lire, car la valeur de la colonne LOB est stockée en ligne dans la même page de données où les valeurs de colonnes non LOB sont stockées. Toutefois, si la requête de sélection comprend une colonne LOB, le nombre de pages à lire pour la récupération des données est alors inférieur à celui des colonnes de type Texte.

Conclusion

Utilisez le type de données VarChar(MAX) plutôt que TEXT pour de bonnes performances.

Source

8
Somnath Muluk

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

4
Klaus Oberdalhoff