Laquelle des requêtes suivantes est la plus rapide (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
ou
SELECT * FROM table WHERE Contains(Column, "test");
sql-server
performance
contains
sql-like
user667429
la source
la source
Réponses:
La seconde (en supposant que vous voulez dire
CONTAINS
, et en fait la mettre dans une requête valide) devrait être plus rapide, car elle peut utiliser une certaine forme d'index (dans ce cas, un index de texte intégral). Bien entendu, cette forme de requête n'est disponible que si la colonne se trouve dans un index de texte intégral. Si ce n'est pas le cas, seul le premier formulaire est disponible.La première requête, utilisant LIKE, ne pourra pas utiliser d'index, car elle commence par un caractère générique, et nécessitera donc toujours une analyse complète de la table.
La
CONTAINS
requête doit être:la source
CONTAINS
? Qu'en est-il? La forme originale de la question neColumn CONTAIN("%test%",Column)>0
devait pas du tout être valable. Ce n'est toujours pas tout à fait raison.Après avoir exécuté les deux requêtes sur une instance SQL Server 2012, je peux confirmer que la première requête a été la plus rapide dans mon cas.
La requête avec le
LIKE
mot clé a montré une analyse d'index en cluster.Le
CONTAINS
avait également une analyse d'index en cluster avec des opérateurs supplémentaires pour la correspondance de texte intégral et une jointure de fusion.la source
LIKE
requête avec un caractère générique de début ne pourra pas utiliser efficacement la partie d'index. Il faudra simplement scanner le tout. Bien qu'il puisse sans doute y avoir des circonstances dans lesquelles l'analyse CI complète fonctionne mieux qu'une requête utilisant l'index de texte intégral (peut-être si une proportion très élevée de lignes correspond par exemple), ce sera en grande partie l'exception pas une règle générale que vous "pouvez confirmer" ".LIKE
.Je pense que cela a
CONTAINS
pris plus de temps et utiliséMerge
parce que vous aviez un tiret ("-") dans votre requêteadventure-works.com
.Le tiret est un mot de coupure, donc la
CONTAINS
recherche dans l'index de texte intégraladventure
et la rechercheworks.com
et la fusion des résultats.la source
Essayez également de changer à partir de ceci:
Pour ça:
Le premier trouvera des enregistrements avec des valeurs comme " ceci est un test " et " un cas de test est le plan ".
Ce dernier trouvera également des enregistrements avec des valeurs comme " je teste ceci " et " c'est le plus grand ".
la source
CONTAINS
, il ne mentionne que l'utilisation de termes préfixes comme 'test *', pas de termes suffixes comme ' test' et pas de recherche de sous-chaîne complète comme '* test '. Mais je ne l'ai pas essayé.