gpt4 book ai didi

sql-server - 优化跨多个表的全文搜索

转载 作者:行者123 更新时间:2023-12-02 23:25:28 26 4
gpt4 key购买 nike

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

我考虑过的一个想法是创建一个索引 View ,然后在该 View 上执行搜索。但由于 View 需要这些 UNION,因此很难看出这样做会更加高效。

最佳答案

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

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

 CONTAINSTABLE(AggregatedTable, AggregatedColumn, @FtsQuery)

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

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

关于sql-server - 优化跨多个表的全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com