sql >> Database >  >> RDS >> Sqlserver

SQL Server-catalogus met volledige tekst en automatisch aanvullen

Mijn eerste opmerking, Ik neem aan dat de volledige naam van de computer vergelijkbaar is met FirstName + ' ' + LastName -- kun je de query voornaam maken zoals 'Carl%' en achternaam zoals 'Gari%' was bedoeld om informatie te verzamelen. Bedankt voor het beantwoorden.

Ik heb dit zelf niet geprobeerd (en het is alleen van belang voor uw omgeving), maar u kunt soortgelijke clausules toevoegen aan de op bevat gebaseerde query en de queryplannen vergelijken met de bevat-versie.

Er zijn 3 mogelijke zoekopdrachten voor de hand liggende zoekopdrachten

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

Ik denk niet dat je gelijk hebt als je zegt dat zoeken met volledige index altijd sneller is dan de LIKE-versie, omdat ik denk dat het juiste antwoord is, dat hangt ervan af.

Als je indexen hebt op de achternaam (of ook voornaam), zou de "like"-versie een geïndexeerde lookup moeten doen. Het hangt af van uw verdeling van sleutels en welk percentage overeenkomt. D.w.z. zoeken naar achternaam zoals 'G%' en voornaam zoals 'Carl%' dan 'Gari%' en 'Carl%' zou veel langzamer zijn als alleen op achternaam wordt geïndexeerd. Dus als u voldoende lange zoeksleutels heeft, zal de LIKE-versie waarschijnlijk sneller zijn dan de versie met bevat. Je zult moeten testen om zeker te weten wat het beste werkt.

Het kan zijn dat de gecombineerde versie altijd de beste keuze is of in ieder geval goed genoeg. Maar ik zou dit zeker eerst proberen voordat ik de onderstaande strategie volg.

De algemene strategie die ik zou voorstellen is:

Stop met het gebruik van incrementeel zoeken totdat de gebruiker ten minste een paar tekens heeft ingetypt - u betaalt waarschijnlijk een groot deel van de prestatiehit om dit te doen, omdat het bijna geen echte waarde heeft voor de gebruikers van uw website. Als suggestie:voer geen incrementele zoekopdrachten uit voordat ze minimaal 3 tekens hebben ingevoerd. Aangezien u niet vermeldde dat u al een minimum aan tekens nodig heeft voor incrementeel zoeken.

Als dit wordt afgewezen, dezelfde basisstrategie, maar u roept de incrementele zoekopdracht niet op totdat er NN milliseconden zijn verstreken sinds het laatste teken dat is getypt of het aantal tekens dat is getypt> enige lengte. Aangezien sommige achternamen slechts uit 2 tekens bestaan, moet u deze strategie in werkelijkheid vrijwel gebruiken.

Evenzo zou ik helemaal geen incrementele zoekopdrachten uitvoeren, ongeacht de lengte, zolang de gebruiker snel nieuwe tekens invoert om verspilde zoekopdrachten te voorkomen die de gebruiker niet gebruikt.

Tenzij de gecombineerde zoekopdracht altijd goed genoeg is, moet u twee verschillende opgeslagen procedures op uw server hebben om zoekresultaten terug te geven, waarvan de ene de soortgelijke versie is en de andere de versie met bevat. Roep de versie aan die naar verwachting de beste resultaten oplevert, afhankelijk van hoeveel van de naam is opgegeven.




  1. 'OPTIE SQL_SELECT_LIMIT=STANDAARD'

  2. Grootte van VARBINARY-veld in SQL Server 2005

  3. Django unieke samen relatie met veld en veeltomie op zichzelf

  4. Wanneer moet een REINDEX in postgres worden uitgevoerd