代码之家  ›  专栏  ›  技术社区  ›  dnord

SQL选择…替换位置-担心效率低下

  •  4
  • dnord  · 技术社区  · 14 年前

    在SQL Server 2005中,我的产品搜索如下所示:

    select ProductID, Name, Email 
    from Product
    where Name = @Name
    

    我被要求忽略product.name中的几个“特殊”字符,这样搜索“po ta to”将返回“po-ta-toes”和“po ta to”。我的第一个想法是这样做:

    select ProductID, Name, Email 
    from Product
    where REPLACE(Name, '-', '') = @Name
    

    …不过,我想,我是否在通过对每个候选结果运行函数来扼杀性能。SQL是否有一些优化的魔力来帮助它快速完成这类工作?你能想出什么更容易的方法来满足我的要求吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Hank Gay    14 年前

    基于更多标准:您可以添加一个新列,例如, searchable_name ,预先计算 REPLACE (以及其他任何调整,如Soundex)开启 INSERT/UPDATE 并将它们存储在新列中,然后对该列进行搜索。

    更少的基于标准:许多RDBMS提供了一个特性,您可以在其中创建 INDEX 使用函数;这通常称为函数索引。您的情况似乎非常适合这样的功能。

    最强大/最灵活:使用专门的搜索工具,如Lucene。在这种情况下,这似乎有些杀伤力过大,但它们是为搜索而设计的,大多数都提供了复杂的词干算法,几乎可以肯定地解决这个问题。

        2
  •  5
  •   George Mastros    14 年前

    如果您愿意强制第一个字符按字母顺序排列,那么您可能会获得更好的性能。

    select ProductID, Name, Email 
    from Product
    where REPLACE(Name, '-', '') = @Name
          And Name Like Left(@Name, 1) + '%'
    

    如果为名称列编制了索引,则可能会得到索引查找而不是扫描。缺点是,您不会返回值为“-po ta to es”的行,因为第一个字符不匹配。

        3
  •  0
  •   Ray    14 年前

    是否可以在产品表中添加已删除特殊字符的产品名称的可搜索版本的字段?然后,您只能对每个记录执行一次“替换”,并对新字段执行有效的搜索。