我有一张接近5kk行的表。他们每个人都有一个文本列,我存储我的XML日志
我试图找出是否有一些日志
<node>value</node>
我试过
SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'
但它永远不会结束。
有没有办法改善此搜索?
PS:我不能删除任何日志
答案 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)
这应优化查询以返回第一行。