Comment puis-je optimiser/refactoriser un TSQL “COMME” clause?
J'ai une table avec 117000 ou de ainsi les dossiers. J'ai besoin d'effectuer une recherche qui vérifie les 3 champs distincts pour un patron de la chaîne.
Ma clause where est comme suit:
field1 LIKE '%' + @DESC + '%'
OR field2 LIKE '%' + @DESC + '%'
OR field3 LIKE '%' + @DESC + '%'
Cela semble prendre environ 24 secondes quelle que soit l'alimentation...
Est-il une meilleure façon de le faire? Moins de 10 (ou 5!) secondes seraient beaucoup plus préférable.
Merci pour toute aide.
OriginalL'auteur IronicMuffin | 2009-10-14
Vous devez vous connecter pour publier un commentaire.
Utilisation de la Recherche Plein Texte et CONTIENT. COMME ne peut pas être optimisé lors de la recherche dans le milieu du terrain, c'est à dire. lorsque l'expression commence par un '%', donc il va toujours faire un full table scan.
Intéressant truc, un renversement de la colonne. Aussi bonne analogie avec le livre de téléphone, fait le cas très claire.
tour de nice , pour obad il n'y a pas quelque chose de semblable pour le like '%%' problème.
Il a certainement à être un '%%' forme, de sorte que la méthode inverse est sorti, mais j'ai vu qu'avant et c'est une astuce. Je vais devoir essayer de la Recherche en Texte Intégral, mais il semble que je vais avoir à convaincre les Administrateurs de bases de données à indexer correctement. Merci pour la suggestion. Je vais voir si Full Text/Contient améliore les performances. Je me souviens de le faire sur l'ancienne base de données avec la même requête et il a été beaucoup plus rapide...pas sûr de ce que le nouveau est en train de faire différemment
Après l'obtention de la DBA à l'Index de Texte Intégral les tables, cela m'a apporté vers le bas de 1 à 3 secondes pour une recherche. Merci pour l'aide!
OriginalL'auteur Remus Rusanu
À tout moment vous commencez une recherche avec un caractère générique, vous êtes en train de faire un scan. À moins que vous pouvez affiner vos critères de recherche pour inclure le premier caractère (qui peut ne pas être possible), vous devrez recourir à une Recherche Plein Texte.
Maintenant, vous êtes juste à jouer avec la sémantique; on INVERSE la colonne et l'index, et puis d'inverser la clause like de sorte qu'il ne commence pas par un caractère générique. Vous n'êtes pas le démarrage d'une recherche avec un caractère générique, donc vous ne faites pas une analyse. Je vais avouer que c'est une solution intéressante, et je vais avoir à garder à l'esprit.
Ceci est incorrect, COMME peuvent être optimisés, même lors de la recherche dans le milieu du terrain. sqlservercentral.com/blogs/dwainsql/2014/03/26/...
C'est donc près de 8 ans plus tard, j'ai appris quelque chose de nouveau 🙂 Jamais pensé à supprimer les valeurs NULLES à partir d'une chaîne de caractères génériques de recherche.
OriginalL'auteur Stuart Ainsworth
Avez-vous vraiment besoin de commencer avec un générique? Pourquoi? Souvent, vous pouvez forcer l'utilisateur à saisir le premier caractère au moins. Je le aborder cette question parce que certains développeurs suffit d'utiliser le caractère générique habitude de ne pas becasue il est une exigence. Dans la plupart des cas, les utilisateurs seront en mesure de saisir les premiers caractères, à moins que l'déposé magasins à chaînes longues (comme le disent officiel de l'aéroport de noms). Sinon, vous avez vraiment besoin d'utiliser l'indexation de texte intégral bien qu'KM du truc avec le revers est assez cool si vous n'avez pas besoin du joker à la fin.
Si vous pouvez éviter de faire de la performance de tuer les choses, alors faites-le.
OriginalL'auteur HLGEM
Que je suis d'accord avec la accepté de répondre que l'Indexation de Texte Intégral serait la meilleure solution et ne suis en aucun cas l'apologie de l'usage de mener des recherches génériques s'ils doivent être réalisées puis il y a sont potentiel de mesures qui peuvent être prises pour rendre la performance de moins mauvais.
Kalen Delaney dans le livre "Microsoft SQL Server 2008 Internals" dit:
De plus, à partir du livre "Si vous avez une colonne de type varchar, vous pouvez accélérer les choses en forçant le classement comme suit: SELECT COUNT(*) FROM tbl OÙ longcol RASSEMBLER SQL_Latin1_General_CP_CI_AS LIKE '%abc%';"
vous signifiait probablement
_CP1_
pas_CP_
OriginalL'auteur Martin Smith
comment sur
ou
OriginalL'auteur THEn
J'ai essayé une solution possible. Avant cette solution, même requête ne retourne pas de résultat et de causer des erreurs de délai de connexion.
Ma requête a été d'avoir la date de filtre et d'autres critères. Tous les autres critères de recherche. Une colonne de mot-clé a été la recherche like '%abc% sur colonne ntext et il était en train de faire le plein balayage de table.
Solution:
Fracture de la requête en 2 parties. 1) Première partie CTE (Common Table Express) 2) s'Appliquent à tous les critères de recherche sur la CTE.
Il a travaillé pour moi.
TOP
clause avec une requête qui a COMME condition sera toujours la performance. La clause TOP plutôt qu'une expression de table commune qui contribue à gain de performance, depuis avec en HAUT une analyse complète est de couper court dès que le nombre requis de documents numérisés.comme un hors-sujet la note à l'aide de(NOLOCK) dans chaque jointure est très dangereux, vous devez être très prudent avec elle ou vous obtiendrez des données dupliquées etc... je vois des gens trowing cet indicateur comme un moyen standard de l'optimisation des requêtes, de ses pas. vous devez toujours penser à deux fois et d'examiner la façon dont les tables sont écrites (insertion/mise à jour) dans votre application avant de trowing dans un indicateur nolock. (juste pour dire)
OriginalL'auteur Agrawars
Si vous ne pouvez pas utiliser FullTextSearch vous pouvez augmenter la vitesse de 10 fois. Faire ensuite:
1 Ajouter un champ calculé:
2 Ajouter des index de champ calculé:
3 Modifiez votre texte de la requête
Source: http://aboutsqlserver.com/2015/01/20/optimizing-substring-search-performance-in-sql-server
OriginalL'auteur Pavel Samoylenko