我正在尝试寻找解决方案以改进字符串搜索过程,因此我选择了全文索引策略。
但是,在实现它之后,我仍然可以看到,在使用多个带有 OR 子句的全文索引表使用多个字符串进行搜索时,性能会受到影响。
(例WHERE CONTAINS(F.*,'%Gayan%') OR CONTAINS(P.FirstName,'%John%')
)
作为一种解决方案,我正在尝试使用CONTAINSTABLE
期望性能改进。
现在,我在CONTAINSTABLE
使用LEFT JOIN
请看下面的例子。
查询 1
SELECT F.Name,p.*
FROM P.Role PR
INNER JOIN P.Building F ON PR.PID = F.PID
LEFT JOIN CONTAINSTABLE(P.Building,*,'%John%') AS FFTIndex ON F.ID = FFTIndex.[Key]
LEFT JOIN P.Relationship PRSHIP ON PR.id = prship.ToRoleID
LEFT JOIN P.Role PR2 ON PRSHIP.ToRoleID = PR2.ID
LEFT JOIN P.Person p ON pr2.ID = p.PID
LEFT JOIN CONTAINSTABLE(P.Person,FirstName,'%John%') AS PFTIndex ON P.ID = PFTIndex.[Key]
WHERE F.Name IS NOT NULL
这会产生以下结果。
查询 2
SELECT F.Name,p.*
FROM P.Role PR
INNER JOIN P.Building F ON PR.PID = F.PID
INNER JOIN P.Relationship PRSHIP ON PR.id = prship.ToRoleID
INNER JOIN P.Role PR2 ON PRSHIP.ToRoleID = PR2.ID
INNER JOIN P.Person p ON pr2.ID = p.PID
WHERE CONTAINS(F.*,'%Gayan%') OR CONTAINS(P.FirstName,'%John%')
AND F.Name IS NOT NULL
结果
期望以作为 SQL SERVEROR
子句行为的方式使用查询 1。据我所知CONTAINSTABLE
,查询 1 将数据与building
表连接起来,其余结果将被忽略,以便表CONTAINSTABLE
的Person
获取已经包含从building
表中过滤的关键字的数据。
如果keyword = Building
,我想匹配两个表中的关键字,而不管在两个表中搜索保存的记录。在每个表中都有一条记录就足够了。
概括
查询 2 执行良好,但在索引中的单词增长时会产生缓慢。查询 1 似乎已优化(当涉及多个在线资源和 MS 文档时),但是,它并没有给我预期的输出。
有没有办法解决这个问题?
我并不严格依附于CONTAINSTABLE
. 建议另一种优化方法也很重要。
谢谢你。