sql-server – 跨多个表的SQL Server全文查询 – 为什么这么慢?
发布时间:2021-03-06 21:43:40 所属栏目:MsSql教程 来源:网络整理
导读:我正在尝试了解我正在构建的SQL Server 2008全文查询的性能. 以下查询使用全文索引立即返回正确的结果: SELECT O.ID,O.NameFROM dbo.EventOccurrence OWHERE FREETEXT(O.Name,'query') 即所有在其名称中带有“查询”字样的EventOccurrences.以下查询使用
我正在尝试了解我正在构建的SQL Server 2008全文查询的性能. 以下查询使用全文索引立即返回正确的结果: SELECT O.ID,O.Name FROM dbo.EventOccurrence O WHERE FREETEXT(O.Name,'query') 即所有在其名称中带有“查询”字样的EventOccurrences.以下查询使用来自不同表的全文索引也会立即返回: SELECT V.ID,V.Name FROM dbo.Venue V WHERE FREETEXT(V.Name,'query') 即.所有场地的名字中都有“查询”字样.但是,如果我尝试连接表并同时执行两个全文查询,则返回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') 这是执行计划: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])) | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Event].[PK_Event] AS [E])) | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[EventOccurrence].[PK_EventOccurrence] AS [O])) |--Concatenation |--Table-valued function |--Table-valued function 从我的阅读中,我认为甚至不可能以这种方式在多个表中进行自由文本查询,所以我不确定我是否正确理解了这一点. 请注意,如果我从最后一个查询中删除WHERE子句,那么它会在一秒内返回所有结果,因此它肯定是导致此问题的全文. 有人可以解释(i)为什么这么慢,以及(ii)如果这甚至支持/如果我甚至正确理解这一点. 在此先感谢您的帮助. 解决方法尝试使用FREETEXTTABLE重写您的查询,看看是否有帮助.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 LEFT JOIN FREETEXTTABLE(dbo.Event,Name,'search') EFT ON E.ID = EFT.[KEY] LEFT JOIN FREETEXTTABLE(dbo.Venue,'search') VFT ON V.ID = VFT.[KEY] WHERE EFT.[KEY] IS NOT NULL OR VFT.[KEY] IS NOT NULL (编辑:广州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读