Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Catalogue de texte intégral et saisie semi-automatique SQL Server

Mon commentaire initial, Je suppose que le nom complet de l'ordinateur est quelque chose de similaire à FirstName + ' ' + LastName - pouvez-vous faire la requête firstname comme 'Carl%' et lastname comme 'Gari%' visait à recueillir des informations. Merci d'y avoir répondu.

Je n'ai pas essayé cela moi-même (et cela n'a d'importance que pour votre environnement), mais vous pouvez ajouter les clauses similaires à la requête basée sur le contenu et comparer les plans de requête à la version contient.

Il y a 3 requêtes possibles requêtes évidentes

A Contains version -- your existing query
A Like Version -- as I commented
A Combined version -- using like and contains

Je ne pense pas que vous ayez nécessairement raison de dire que la recherche dans l'index complet est toujours plus rapide que la version LIKE, car je pense que la bonne réponse est, cela dépend.

Si vous avez des index sur le nom (ou le prénom aussi), la version "like" devrait faire une recherche indexée. Cela dépendra de votre répartition des clés et du pourcentage de correspondance. Par exemple, rechercher un nom de famille comme 'G%' et un prénom comme 'Carl%' plutôt que 'Gari%' et 'Carl%' serait beaucoup plus lent si l'indexation ne portait que sur le nom de famille. Ainsi, si vous avez des clés de recherche suffisamment longues, la version LIKE sera probablement plus rapide que la version contient. Vous devrez tester pour savoir ce qui fonctionne le mieux à coup sûr.

Il se peut que la version combinée soit toujours le meilleur choix ou du moins assez bonne. Mais j'essaierais certainement d'abord cela avant de suivre la stratégie ci-dessous.

La stratégie globale que je suggérerais est la suivante :

Arrêtez d'utiliser la recherche incrémentielle jusqu'à ce que l'utilisateur ait saisi au moins quelques caractères - vous payez probablement une grande partie de la performance pour le faire car cela n'a presque aucune valeur réelle pour les utilisateurs de votre site Web. À titre de suggestion, ne faites pas de recherche incrémentielle avant d'avoir saisi au moins 3 caractères. Puisque vous n'avez pas mentionné que vous avez déjà besoin d'un minimum de caractères avant la recherche incrémentielle.

Si cela fait l'objet d'un veto, même stratégie de base, mais vous n'invoquez pas la recherche incrémentielle jusqu'à ce que NN millisecondes se soient écoulées depuis le dernier caractère tapé ou le nombre de caractères tapés> une certaine longueur. En fait, comme certains noms de famille ne comportent que 2 caractères, vous devez pratiquement utiliser cette stratégie dans la réalité.

De même, je ne ferais aucune recherche incrémentielle quelle que soit la longueur tant que l'utilisateur saisit rapidement de nouveaux caractères pour éviter les recherches inutiles que l'utilisateur n'utilise pas.

À moins que la requête combinée ne soit toujours suffisante, disposez de deux procédures stockées différentes sur votre serveur pour renvoyer les résultats de la recherche, l'une étant la version similaire, l'autre étant la version contient. Appelez la version censée obtenir les meilleurs résultats en fonction de la quantité de nom fournie.