sql-server – 使用CONTAINS添加更多OR搜索带来查询以进行爬网

前端之家收集整理的这篇文章主要介绍了sql-server – 使用CONTAINS添加更多OR搜索带来查询以进行爬网前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的查询依赖于两个全文索引表,但是当我将CONTAINS与任何其他OR搜索结合使用时,它运行得非常慢.正如执行计划中所见,这两个全文搜索会破坏性能.如果我仅使用CONTAINS中的一个查询,或者两者都不查询,则查询是亚秒级的,但是当您将OR添加到混合中时,查询就会变得不合时宜.

这两张表并不特别,它们不是太宽(一个42个,另一个21个;可能每个10个列都是FT索引),甚至包含很多记录(两个中最大的36个记录).

我能够通过将两个CONTAINS搜索分成他们自己的SELECT查询解决性能,然后将这三个UNION一起解决. UNION的解决方案是我唯一的希望吗?

谢谢.

SELECT     a.CollectionID
FROM       collections    a
INNER JOIN determinations b ON a.CollectionID = b.CollectionID 
WHERE      a.CollrTeam_Text LIKE '%fa%'
           OR CONTAINS(a.*,'"*fa*"')
           OR CONTAINS(b.*,'"*fa*"')

执行计划(我想在发布图像之前需要更多声誉):http://yfrog.com/7dslowcontainsj http://desmond.yfrog.com/Himg265/scaled.php?tn=0&server=265&filename=slowcontains.jpg&xsize=640&ysize=640

解决方法

我很想知道LEFT JOIN到等效的CONTAINSTABLE会不会更好.就像是:
SELECT     a.CollectionID
FROM       collections    a
INNER JOIN determinations b ON a.CollectionID = b.CollectionID 
LEFT JOIN CONTAINSTABLE(a,*,'"*fa*"') ct1 on a.CollectionID = ct1.[Key]
LEFT JOIN CONTAINSTABLE(b,'"*fa*"') ct2 on b.CollectionID = ct2.[Key]
WHERE      a.CollrTeam_Text LIKE '%fa%'
           OR ct1.[Key] IS NOT NULL
           OR ct2.[Key] IS NOT NULL

猜你在找的MsSQL相关文章