Sql server 跨多个表优化全文搜索

Sql server 跨多个表优化全文搜索,sql-server,sql-server-2008,full-text-search,Sql Server,Sql Server 2008,Full Text Search,我需要在SQL Server数据库中搜索多个不同的表。我需要根据匹配发生的表对结果进行排序 我采取的方法如下所示。然而,随着数据量的增长,这似乎不是很有效 有人能提出一些优化的方法吗 -- Full-text query DECLARE @FtsQuery nvarchar(100) SET @FtsQuery = 'FORMSOF(INFLECTIONAL, detail)' -- Maximum characters in description column DECLARE @MaxDe

我需要在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

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

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

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

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

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

您可以安全地执行的一个简单优化是将
UNION
替换为
UNION ALL
。更多信息:有趣。您采取了什么样的方法来获取修改后的数据并将其推送到聚合表中?计划的作业通常需要多长时间才能运行?我们使用sql代理计划的存储过程来更新非规范化的表。我们的基础数据在每一行上都有一个日期时间戳,指示最后一次触摸(插入或更新)行的时间,因此我们使用它每5或10分钟进行一次增量填充。我们的初始负载花费了一个小时左右,但增量人口只需要10或20秒。感谢您的输入。我认为唯一值得关注的问题是:(1)查询表以确定符合更新条件的记录所需的时间,以及(2)是否有任何停机时间和通常会运行的更新(并且只查看了很久以前的记录)无法运行。