如何改进这种无休止的查询?

时间:2012-04-12 15:13:36

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

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

我试图找出是否有一些日志

<node>value</node>

我试过

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

但它永远不会结束。

有没有办法改善此搜索?

PS:我不能删除任何日志

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您正在使用类似的查询。 没有涉及索引=没有好处 不幸的是,你现在没有什么可以用来加快这一点。

答案 4 :(得分:0)

我认为这不会有所帮助,只能尝试使用FAST x query hint

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

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