【问题标题】:How to overcome ( SQL Like operator ) performance issues?如何克服(SQL Like 运算符)性能问题?
【发布时间】:2013-03-04 11:25:29
【问题描述】:

我有 Users 表包含大约 500,000 行用户数据

用户的全名存储在 4 列中,每列的类型为 nvarchar(50)

我有一个名为 UserFullName 的计算列,它等于 4 列的组合

我有一个 Stored Procedure 使用 like operatior 按名称在 Users 表中搜索,如下所示

Select * 
From Users 
Where UserFullName like N'%'+@FullName+'%'

我在执行此 SP 时遇到性能问题.. 需要很长时间 :(

有什么办法可以克服使用 Like 运算符的性能不足的问题吗?

【问题讨论】:

  • 尝试在 4 列中覆盖索引?在查询分析器中运行查询,这也会有所帮助。
  • 为什么需要使用LIKEUserFullName 字段与 @FullName 相比有哪些额外的文本?
  • 客户端需要通过名称的任何部分进行搜索以获取其全名包含该部分的任何用户

标签: sql sql-server sql-server-2008 search sql-like


【解决方案1】:

在仍然以这种方式使用 like 运算符的时候不行。开头的 % 意味着您的搜索需要读取每一行并寻找匹配项。如果你真的需要这种搜索,你应该考虑使用全文索引。

【讨论】:

    【解决方案2】:

    确保您的计算列已编入索引,这样您就不必每次SELECT 时都计算值

    此外,根据您的索引,使用PATINDEX 可能会更快,但实际上您应该为此类事情使用全文索引: http://msdn.microsoft.com/en-us/library/ms187317.aspx

    【讨论】:

      【解决方案3】:

      如果你使用索引会很好。

      所以你可以给列一个 id 或其他东西,像这样:

      Alter tablename add unique index(id)
      

      【讨论】:

      • 请写“你”而不是“你”,这不是短信。
      【解决方案4】:

      看看那篇文章http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning

      它很容易地描述了 LIKE 在性能方面的工作原理。

      您可能正面临此类问题,因为您的整个表都应该被遍历,因为第一个 % 符号。

      您应该尝试创建一个表示 k-mers 的子字符串列表(例如在单独的表中)并在不使用 % 的情况下搜索它们。此外,此类列的索引会有所帮助。请在https://en.m.wikipedia.org/wiki/K-mer 阅读更多关于 KMer 的信息。

      这不会破坏索引并且搜索效率会更高。

      【讨论】:

        猜你喜欢
        • 2021-08-21
        • 2014-04-26
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 2021-10-24
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多