Question

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 SQL Server 2005. et les versions suivantes de SQL SERVER.

Si je souhaite rechercher 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 '% chaîne de recherche%'

  2. Utilisez la colonne TEXT et placez un Index de texte intégral / Catalogue sur cette colonne, puis effectuez une recherche à l'aide du CONTIENT clause?

    WHERE CONTAINS (Col1, 'MyToken')

Était-ce utile?

La solution

Le type VARCHAR (MAX) remplace le 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, sauf si la limitation 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 offre, c’est qu’elle peut également être utilisée avec = et GROUP BY comme n’importe quel autre VARCHAR. La colonne peut être. Cependant, si vous avez beaucoup de données, l'utilisation de ces méthodes posera un grave problème de performances.

Indiquez si vous devez utiliser LIKE pour la 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 à implémenter 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.

Autres conseils

Pour les textes de grande taille, l'index de texte intégral est beaucoup plus rapide. Mais vous pouvez également indexer le texte intégral varchar (max) .

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'

Ceci 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'est-à-dire.

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

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

  • Lequel utiliser?

Voir le lien MSDN . Microsoft suggère d'éviter l'utilisation du Texte type de données et il 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. Les données While 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 la colonne Varchar (max) traverse les 8 000 octets, la valeur de la 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 qui ne fonctionnent pas dans la colonne de type Texte, mais fonctionnent dans la colonne de type VarChar (Max).

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

    • Considérations relatives aux E / S système

Comme nous le savons, les valeurs de colonne de type VarChar (Max) ne sont stockées hors ligne que 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 il va le stocker dans la rangée. Donc, 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. Mais 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 un type de données VarChar (MAX) plutôt que TEXT pour obtenir de bonnes performances.

Source

Si vous utilisez MS Access (en particulier les anciennes versions telles que 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 en tant que champ Mémo.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top