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");
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");
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:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Qu'en est-il? La forme originale de la question ne Column 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.
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ête adventure-works.com
.
Le tiret est un mot de coupure, donc la CONTAINS
recherche dans l'index de texte intégral adventure
et la recherche works.com
et la fusion des résultats.
Essayez également de changer à partir de ceci:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Pour ça:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
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 ".
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é.