我有一个简单的查询依赖于两个全文索引表,但是当我将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*"')
Run Code Online (Sandbox Code Playgroud)
执行计划(我想在发布图片之前需要更多声誉):http: //yfrog.com/7dslowcontainsj http://desmond.yfrog.com/Himg265/scaled.php?tn=0&server=265&filename=slowcontains.jpg&xsize = 640&YSIZE = 640
sql-server full-text-search full-text-indexing sql-server-2008
我正在尝试了解我正在构建的SQL Server 2008全文查询的性能.
以下查询使用全文索引立即返回正确的结果:
SELECT
O.ID, O.Name
FROM
dbo.EventOccurrence O
WHERE
FREETEXT(O.Name, 'query')
Run Code Online (Sandbox Code Playgroud)
即所有在其名称中带有"查询"字样的EventOccurrences.以下查询使用来自不同表的全文索引也会立即返回:
SELECT
V.ID, V.Name
FROM
dbo.Venue V
WHERE
FREETEXT(V.Name, 'query')
Run Code Online (Sandbox Code Playgroud)
即.所有场地的名字中都有"查询"字样.但是,如果我尝试连接表并同时执行两个全文查询,则返回12秒:
SELECT
O.ID, O.Name
FROM
dbo.EventOccurrence O
INNER JOIN dbo.Event E ON O.EventID = E.ID
INNER JOIN dbo.Venue V ON E.VenueID = V.ID
WHERE
FREETEXT(E.Name, 'search')
OR FREETEXT(V.Name, 'search')
Run Code Online (Sandbox Code Playgroud)
这是执行计划:http://uploadpad.com/files/query.PNG
更新:以文本形式的计划:
|--Nested Loops(Left Semi Join, OUTER REFERENCES:([E].[ID], [V].[ID]))
|--Hash Match(Inner Join, HASH:([E].[ID])=([O].[EventID]))
| |--Hash Match(Inner Join, HASH:([V].[ID])=([E].[VenueID]))
| | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Venue].[PK_Venue] AS [V])) …
Run Code Online (Sandbox Code Playgroud)