4

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

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

<node>value</node>

我试过了

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

但它永远不会结束。

有什么办法可以改善这种搜索吗?

PS:我不能删除任何日志

4

5 回答 5

9

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

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

于 2012-04-12T15:21:34.957 回答
1

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

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

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

于 2012-04-12T15:16:14.737 回答
1

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

于 2012-04-12T15:43:39.440 回答
0

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

于 2012-04-12T15:17:01.273 回答
0

我认为这无济于事,但请尝试使用FAST x 查询提示,如下所示:

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

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

于 2012-04-12T15:27:59.677 回答