我们的系统中有一些查询使用LIKE'%'+ @ SomeCriteria +'%'来搜索某个人的姓名。在这种情况下,我们正在讨论VARCHAR(50)字段。我们真的希望允许我们的用户在名称中进行搜索。
我理解它的方式,索引字段只会使搜索名称的第一部分变得更快,而全文索引将搜索特定的单词,但据我所知,当我告诉时无效在文字中搜索。
在没有进行完整的表扫描的情况下,SQL 2008中有没有一种方法可以有效地搜索给定条件的单词内部?我注定要提出复杂的自定义方法,或者查询速度一直很慢吗?
答案 0 :(得分:3)
好吧,使用Full Text Search可以解决问题(编辑:请参阅下面的评论,这将 NOT 用于后缀/中期搜索),但对于您的方案可能有点过分(或者可能不是)。正如你已经提到的那样,索引将帮助很少,尽管@Aaron已经提到它在2k5中有所改进(只有其他方式它才会有所帮助,如果你有一个覆盖的非聚集索引将被扫描对集群,这将只有非聚集索引的原始大小实际上更小,即扫描的数据更少时才有用。
可能的自定义解决方案是从您正在搜索的字符列创建computed column并将其持久化/索引,但如果您正在搜索字符串的设置位置或组件,这实际上只是可行/有用(例如,如果您要搜索类似电子邮件字段的内容,则可以创建一个计算列,该模式匹配/具体化电子邮件地址的域部分,然后保留/索引并在那里查询)。
答案 1 :(得分:2)
我们曾经做过一次有助于查询缓慢的问题是我们有一个存储过程,它运行两段代码而不是一段代码。首先,我们进行了精确匹配搜索,然后只进行了不精确的搜索,如果确切的搜索没有返回结果(或者在一种情况下,如果完全匹配搜索返回的结果少于5)。这样,愿意输入全名的用户得到了快速响应,但那些只想输入几个字符的用户得到的速度较慢。您可以使用三种可能性,完全匹配,仅在结束时不精确匹配以及在前端和末尾不精确匹配。
答案 2 :(得分:1)
这在SQL Server 2005中有所改进,但它不是你有很多直接控制的东西......
http://technet.microsoft.com/en-us/library/cc966419.aspx#XSLTsection131121120120
答案 3 :(得分:0)
在我使用Soundex取得很大成功的那一天。我要求美国人需要搜索类似的东欧姓氏,例如: Elanov / Ilanov / Yllanov将有类似的Soundex签名。