Jon*_*ood 5 sql-server full-text-search sql-server-2008
我需要在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
Run Code Online (Sandbox Code Playgroud)
我考虑过的一个想法是创建一个索引视图,然后在视图上执行搜索.但由于视图需要这些UNION,因此很难看出效率会更高.
这是一个难题,因为CONTAINSTABLE一次只能搜索单个表的FTS索引.只要您的性能可以接受,您的UNION解决方案就可以了.
我们遇到了需要在单个查询中有效搜索多个表中的多个列的相同问题.我们所做的是将这些列和表中的所有数据聚合到一个只读表中.然后我们的查询只需要一个CONTAINSTABLE调用
CONTAINSTABLE(AggregatedTable, AggregatedColumn, @FtsQuery)
Run Code Online (Sandbox Code Playgroud)
我们有一个每5-10分钟运行一次的计划作业,并将源表中的任何修改内容逐步聚合到我们的单个只读聚合内容表中.
通常,似乎在任何合理大小的数据库和用户负载中使用FTS意味着您总是在与性能作斗争.如果您发现无论您做什么都无法让性能得到接受,您可能需要调查其他技术,例如 Lucene.