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

SQL Server 05,这是最佳的,例如%<term>%或CONTAINS(),用于搜索大型列

  •  4
  • Spud1  · 技术社区  · 16 年前

    我有一个由另一个开发人员编写的函数,我正试图修改它以供稍微不同的使用。SP使用它来检查存储在DB中的文本文档中是否存在某个短语,如果找到该值,则返回1;如果找不到该值,则返回0。以下是查询:

    SELECT @mres=1 from documents where id=@DocumentID
     and contains(text, @search_term)
    

    文档主要包含XML,搜索项是一个格式化为nvarchar的GUID(40)。

    SELECT @mres=1 from documents where id=@DocumentID
    and textlike '%' + @search_term + '%'
    

    这个版本的运行速度要快得多,与第一个示例中的15ms相比,它需要4ms。

    所以,我的问题是为什么要用第一个而不是第二个?我想这个开发人员(他不再和我一起工作)有一个很好的理由,但目前我正在努力找到它。。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Justin    16 年前

    更新: 我所有的答案都错了!

    CONTAINS 确实在使用全文搜索(请参阅 http://msdn.microsoft.com/en-us/library/ms187787.aspx )所以应该很快(或者至少应该适当地扩展)

    第二个版本(使用 LIKE )如果您的表不包含太多行,则可能会更快—调用全文引擎进行搜索将产生少量额外开销,这可能意味着使用 对于小桌子来说稍微快一点。

    另一方面,如果最上面的查询需要5-6秒来执行,那么我会说可能有什么地方出错了-再次尝试查看执行计划。

        2
  •  0
  •   Amr ElGarhy    16 年前

    总会有这样的情况:一种选择比另一种更快,反之亦然。最好的选择是在生产环境中测试相同的查询,并查看它们之间的差异。对于这种性能测试,我建议使用profiler,将每个查询运行多次,并取平均值进行比较