2009-07-15 9 views
1

J'ai une table SQL Server 2005 qui a un champ varchar (250) qui contient des mots-clés que je vais utiliser à des fins de recherche. Je ne peux pas changer le design. Les données ressemble à ceci ...Méthode efficace pour interroger un champ Varchar délimité dans SQL

personnelle, propriété, coût, avenant

Quel est le moyen le plus efficace pour exécuter des requêtes de recherche contre ces mots-clés? La seule chose à laquelle je peux penser est ...

WHERE Keywords LIKE '%endorse%' 
+0

Autorisez-vous les virgules dans la recherche? – dotjoe

+0

Oui, les virgules sont autorisées. –

Répondre

4

Depuis la normalisation n'est pas une option, la meilleure option va être à configurer et à utiliser Texte complet Recherche. Cela maintiendra un index de recherche interne qui vous facilitera la recherche dans vos données. Le problème avec des solutions comme LIKE '% pattern%' est que cela produira une analyse de table complète (ou peut-être une analyse d'index complète) qui pourrait produire des verrous sur une grande quantité de données dans votre table, ce qui ralentira toutes les opérations qui touchent la table en question.

+0

On dirait que la bonne réponse ... mais si FTI n'est pas déjà activé/configuré/quoi que ce soit dans le système, l'ajouterait être autant un deal-breaker que de modifier la structure de la table? –

+0

Avec SQL Server 2005, vous devrez obtenir un DBA pour installer la fonction FTS, ce qui peut poser des problèmes selon la situation. Une fois FTS installé, la création des index est simple. Cela pourrait être une vente plus facile que la normalisation, car les autres applications qui accèdent aux données sources n'auront pas besoin d'être modifiées. –

+0

Merci pour la réponse! Comment configurer la recherche en texte intégral? Pouvez-vous me relier, s'il vous plaît? –

1

le moyen le plus efficace est de normaliser votre conception db. ne jamais stocker les valeurs CSV dans une seule cellule. Autre que d'utiliser comme vous pourriez envisager la recherche de texte intégral.

+0

Réponse sans importance. –

+2

êtes-vous sûr que cela ne vaut rien? Je vous ai donné la seule autre option valide que vous pouvez utiliser. patindex et toutes les autres choses est juste comme "Like" –

+0

En dehors de la normalisation (ce qui n'est pas une option à OP), et PATINDEX, FTS est l'autre option performant. Honnêtement, FTS est probablement la meilleure option car elle sera optimisée pour le volume de données que vous avez et retournera probablement de meilleurs résultats en moins de temps et avec moins d'opérations d'E/S que PATINDEX. –

0

Vous pouvez utiliser PATINDEX()

USE AdventureWorks; 
GO 
SELECT PATINDEX('%ensure%',DocumentSummary) 
FROM Production.Document 
WHERE DocumentID = 3; 
GO 

http://msdn.microsoft.com/en-us/library/ms188395%28SQL.90%29.aspx

+0

Merci. Pensez-vous que c'est plus efficace que LIKE? –

+1

Selon le premier commentaire ici: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/is-patindex-faster-than-like.aspx, l'indexation en texte intégral pourrait être un moyen encore meilleur de aller. Texte intégral: http://msdn.microsoft.com/en-us/library/ms142571.aspx –

Questions connexes