Utilisation de varchar (MAX) vs TEXT sur SQL Server
-
08-07-2019 - |
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?
-
Utilisation de la clause
LIKE
contre une colonneVARCHAR (MAX)
?WHERE COL1 LIKE '% chaîne de recherche%'
-
Utilisez la colonne
TEXT
et placez un Index de texte intégral / Catalogue sur cette colonne, puis effectuez une recherche à l'aide duCONTIENT
clause?WHERE CONTAINS (Col1, 'MyToken')
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
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).
-
=
égal à l'opérateur sur la colonne de type VarChar (Max) -
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.
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.