我有一张接近 5kk 行的桌子。他们每个人都有一个文本列,我在其中存储我的 XML 日志
我试图找出是否有一些日志
<node>value</node>
我试过了
SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'
但它永远不会结束。
有什么办法可以改善这种搜索吗?
PS:我不能删除任何日志
我有一张接近 5kk 行的桌子。他们每个人都有一个文本列,我在其中存储我的 XML 日志
我试图找出是否有一些日志
<node>value</node>
我试过了
SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'
但它永远不会结束。
有什么办法可以改善这种搜索吗?
PS:我不能删除任何日志
诸如通配符查询'%<node>value</node>%'
将导致全表扫描(忽略索引),因为它无法确定在字段中的哪个位置可以找到匹配项。我所知道的改进此查询的唯一真正方法(没有分区表等,如果表不断记录,则应考虑)是向表中添加全文目录和索引,以便在该字段上提供更有效的搜索。
这是一个很好的参考,应该可以引导您完成它。完成此操作后,您可以使用针对此类检索优化的 CONTAINS 和 FREETEXT 运算符。
不幸的是,我能看到的唯一优化方法是在该列上实现全文搜索,但即使这样也很难构建到它只返回特定元素中的特定值的位置。
我目前正在做一些工作,我也在其中一列中存储 XML。但我假设对该数据所需的任何查询都需要很长时间,这对我们的需求来说是可以的。
另一个选项与将数据存储在二进制列中有关,然后 SQL Server 具有用于指定在该字段中存储的文档类型的选项。例如,这允许您在该字段上实现更有意义的全文搜索。但是我很难想象这会有效地满足您的要求。
除了在该列上实现全文搜索和索引表之外,也许您可以通过其他参数(日期等)缩小结果。此外,您可以添加一个名为“Tags”的表字段(varchar 类型),您可以在插入行时填充该字段。该字段将为该日志注册“关键字、标签”。这样,您可以将此字段作为条件更改您的查询。
您正在使用类似查询。不涉及索引 = 不好 不幸的是,您无法利用目前的资源来加快速度。
我认为这无济于事,但请尝试使用FAST x 查询提示,如下所示:
SELECT id_log
FROM Table_Log
WHERE log_text LIKE '%<node>value</node>%'
OPTION(FAST 1)
这应该优化查询以返回第一行。