【问题标题】:How can I improve this endless query?如何改进这个无休止的查询?
【发布时间】:2012-04-24 23:18:22
【问题描述】:

我有一张接近 5kk 行的表格。他们每个人都有一个文本列,我在其中存储我的 XML 日志

我正在尝试找出是否有一些日志

<node>value</node>

我试过了

SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'

但它永远不会结束。

有什么方法可以改进这个搜索吗?

PS:我不能删除任何日志

【问题讨论】:

  • 基本上,自从您搜索LIKE '%....%' 后,您就确定没有任何索引可以提供任何帮助。所以我担心 - 不 - 你真的无法做任何事情来加快这个速度......可能有帮助的唯一事情就是拥有一个 DATETIME 列并对其进行索引,然后限制您的搜索,例如最后一个月左右(因此只是减少了要搜索的行数......)
  • 等了10多分钟还是没有结果
  • @EpicVendetta - 听起来不错。
  • 另外:没有ORDER BYTOP x 毫无意义——你只会得到随机结果.....如果你使用TOP——还要定义一个订单!
  • log_text 列的数据类型是什么,您使用的是哪个版本的 SQL Server?

标签: sql sql-server tsql optimization query-optimization


【解决方案1】:

诸如'%&lt;node&gt;value&lt;/node&gt;%' 之类的通配符查询将导致全表扫描(忽略索引),因为它无法确定在字段中的哪个位置可以找到匹配项。我所知道的唯一真正改进此查询的方法(没有分区表等,如果表不断记录,则应考虑)是向表中添加全文目录和索引,以便在该字段上提供更有效的搜索。

Here 是一个很好的参考资料,应该可以引导您完成它。完成此操作后,您可以使用针对此类检索优化的 CONTAINS 和 FREETEXT 运算符。

【讨论】:

    【解决方案2】:

    除了在该列上实现全文搜索和索引表之外,也许您可​​以通过其他参数(日期等)缩小结果。 此外,您可以添加一个名为“Tags”的表字段(varchar 类型),您可以在插入行时填充该字段。该字段将为该日志注册“关键字、标签”。这样,您可以将此字段作为条件更改您的查询。

    【讨论】:

      【解决方案3】:

      不幸的是,我能看到的唯一优化方法是在该列上实现全文搜索,但即使这样也很难构造到它只返回特定元素中的特定值。

      我目前正在做一些工作,我也在其中一列中存储 XML。但我假设对该数据所需的任何查询都需要很长时间,这对我们的需求来说是可以的。

      另一个选项与将数据存储在二进制列中有关,然后 SQL Server 具有用于指定在该字段中存储的文档类型的选项。例如,这允许您在该字段上实现更有意义的全文搜索。但我很难想象这会有效地满足您的要求。

      【讨论】:

        【解决方案4】:

        您正在使用类似查询。 不涉及索引 = 不好 不幸的是,您无法利用目前的资源来加快速度。

        【讨论】:

          【解决方案5】:

          我认为这无济于事,但请尝试像这样使用FAST x query hint

          SELECT id_log 
          FROM Table_Log 
          WHERE log_text LIKE '%<node>value</node>%' 
          OPTION(FAST 1)
          

          这应该优化查询以返回第一行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-21
            • 2019-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多