Je viens de lire que le VARCHAR(MAX)
type de données (qui peut stocker près de 2 Go de données de caractères) est le remplacement recommandé pour le TEXT
type de données dans les versions SQL Server 2005 et Next SQL SERVER.
Si je veux rechercher une chaîne dans une colonne, quelle opération est la plus rapide?
Vous utilisez la
LIKE
clause contre uneVARCHAR(MAX)
colonne?WHERE COL1 LIKE '%search string%'
Utiliser la
TEXT
colonne et placer un index / catalogue de texte intégral sur cette colonne, puis effectuer une recherche à l'aide de laCONTAINS
clause?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
user85116
la source
la source
TEXT
etNTEXT
(etIMAGE
) sont déconseillés.Réponses:
Le
VARCHAR(MAX)
type remplaceTEXT
. La différence fondamentale est qu'unTEXT
type stockera toujours les données dans un blob alors que leVARCHAR(MAX)
type tentera de stocker les données directement dans la ligne à moins qu'il ne dépasse la limite de 8k et qu'à 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 que
VARCHAR(MAX)
vous donne est qu'elle peut également être utilisée avec=
etGROUP BY
comme n'importe quelle autreVARCHAR
colonne. Cependant, si vous avez beaucoup de données, vous aurez un énorme problème de performances en utilisant ces méthodes.En ce qui concerne si vous devez utiliser
LIKE
pour rechercher, ou si vous devez utiliser l' indexation de texte intégral etCONTAINS
. Cette question est la même indépendamment deVARCHAR(MAX)
ouTEXT
.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.la source
Pour le texte volumineux, l' index de texte intégral est beaucoup plus rapide. Mais vous pouvez également indexer le texte intégral
varchar(max)
.la source
Vous ne pouvez pas rechercher un champ de texte sans le convertir du texte en varchar.
Cela donne une erreur:
Alors que cela ne signifie pas:
Fait intéressant,
LIKE
fonctionne toujours, à savoirla source
varchar(n)
outext
, et surmonter cette réponse. Pensez-vous, dans un environnement professionnel, qu'argumenter avec des déclarations vagues aidera à résoudre le problème? Tous les articles sur StackOverflow sont destinés à être vus par des milliers de personnes, agissez en conséquence!TEXT
etVarChar(MAX)
sont des types de données de caractères à longueur variable non Unicode de grande taille, qui peuvent stocker au maximum 2147483647 caractères non Unicode (c'est-à-dire que la capacité de stockage maximale est de 2 Go).Selon le lien MSDN, Microsoft suggère d'éviter d'utiliser le type de données Text 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.
Les données d'une
Text
colonne de type sont stockées hors ligne dans des pages de données LOB distinctes. La ligne de la page de données de table n'aura 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'uneVarchar(max)
colonne de type sont stockées en ligne si elles sont inférieures ou égales à 8000 octets. Si la valeur de la colonne Varchar (max) dépasse les 8000 octets, la valeur de la colonne Varchar (max) est stockée dans des pages de données LOB distinctes et la ligne n'aura qu'un pointeur de 16 octets vers la page de données LOB où les données réelles sont présentes. DoncIn-Row
Varchar (Max) est bon pour les recherches et la récupération.Certaines des fonctions de chaîne, des opérateurs ou des constructions qui ne fonctionnent pas sur la colonne de type Texte, mais elles fonctionnent sur la colonne de type VarChar (Max).
=
Égal à l'opérateur sur la colonne de type VarChar (Max)Clause Group by sur la colonne de type VarChar (Max)
Comme nous savons que les valeurs de la colonne de type VarChar (Max) sont stockées hors ligne uniquement si la longueur de la valeur à y stocker est supérieure à 8 000 octets ou s'il n'y a pas assez d'espace dans la ligne, sinon elle stockera il en ligne. Ainsi, si la plupart des valeurs stockées dans la colonne VarChar (Max) sont volumineuses et stockées hors ligne, le comportement de récupération des 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 en ligne. La récupération des données dans lesquelles les colonnes LOB ne sont pas incluses nécessite plus 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 des colonnes 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 des données par rapport aux colonnes de type texte.
Conclusion
Utilisez
VarChar(MAX)
le type de données plutôt queTEXT
pour de bonnes performances.La source
la source
Si vous utilisez MS Access (en particulier les anciennes versions comme 2003), vous êtes obligé d'utiliser le
TEXT
type de données sur SQL Server car MS Access ne reconnaît pasnvarchar(MAX)
comme un champ Mémo dans Access, alors qu'ilTEXT
est reconnu comme un champ Mémo.la source