【问题标题】:Optimize Full-Text Search Across Multiple Tables优化跨多个表的全文搜索
【发布时间】:2012-02-14 11:49:23
【问题描述】:

我需要在我的 SQL Server 数据库中搜索几个不同的表。我需要根据匹配发生在哪个表中对结果进行排序。

我采用的方法如下所示。但是,随着数据量的增长,这似乎不是很有效。

任何人都可以建议任何技巧来优化它吗?

-- Full-text query
DECLARE @FtsQuery nvarchar(100)
SET @FtsQuery = 'FORMSOF(INFLECTIONAL, detail)'

-- Maximum characters in description column
DECLARE @MaxDescription int
SET @MaxDescription = 250

SELECT 1 AS RankGroup, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) AS Description FROM Table1
    INNER JOIN CONTAINSTABLE(Table1, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table1.Id
UNION SELECT 2, FTS.Rank, Id, Title, NULL FROM Table2
    INNER JOIN CONTAINSTABLE(Table2, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table2.Id
UNION SELECT 3, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table3
    INNER JOIN CONTAINSTABLE(Table3, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table3.Id
UNION SELECT 4, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table4
    INNER JOIN CONTAINSTABLE(Table4, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table4.Id
UNION SELECT 5, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table5
    INNER JOIN CONTAINSTABLE(Table5, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table5.Id
ORDER BY RankGroup, Rank DESC

我考虑过的一个想法是创建一个索引视图,然后对视图执行搜索。但由于视图需要这些UNIONs,很难看出这将如何更有效。

【问题讨论】:

标签: sql-server sql-server-2008 full-text-search


【解决方案1】:

这是一个难题,因为 CONTAINSTABLE 一次只能搜索单个表的 FTS 索引。只要您的性能可以接受,您上面的 UNION 解决方案就可以了。

我们遇到了同样的问题,即需要在单个查询中从多个表中高效地搜索多个列。我们所做的是将这些列和表中的所有数据聚合到一个只读表中。然后我们的查询只需要一个 CONTAINSTABLE 调用

 CONTAINSTABLE(AggregatedTable, AggregatedColumn, @FtsQuery)

我们有一个每 5-10 分钟运行一次的计划作业,并将源表中的任何修改内容增量聚合到我们的单个只读聚合内容表中。

一般来说,在任何大小合理的数据库和用户负载中使用 FTS 似乎意味着您总是在与性能作斗争。如果您发现无论您做什么都无法使性能达到可接受的水平,您可能需要研究其他技术,例如 Lucene.

【讨论】:

  • 有趣。您采用什么类型的方法来获取更改的数据并将其推送到聚合表?该计划的作业通常需要多长时间才能运行?
  • 我们使用由 sql 代理调度的存储过程来更新非规范化表。我们的基础数据在每一行上都有一个日期时间戳,指示该行最后一次被触摸(插入或更新)的时间,因此我们使用它来每 5 或 10 分钟进行一次增量填充。我们的初始加载需要一个小时左右,但增量人口只需要 10 或 20 秒。
  • 感谢您的意见。我想唯一值得关注的问题是:(1)查询表以确定符合更新条件的记录所需的时间,以及(2)是否有任何停机时间和通常会运行的更新 - 并且看起来只记录了这么久以前的记录 - 未能运行。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2013-02-15
  • 2011-08-29
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多