我有一个简单的查询依赖于两个全文索引表,但是当我将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