在这种情况下,SQL Server 2008全文搜索(FTS)非常慢:
查询1:
SELECT [...] FROM ContentItem CI WHERE
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table1**], *, '"[search_string]*"') FT
WHERE FT.[Key] = CI.ContentItem_Id))
ORDER BY [...]
结果:在SQL 2005和SQL 2008上超快
查询2:
SELECT [...] FROM ContentItem CI WHERE
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table2**], *, '"[search_string]*"') FT
WHERE FT.[Key] = CI.ContentItem_Id))
ORDER BY [...]
结果:在SQL 2005和SQL 2008上超快
查询3:
SELECT [...] FROM ContentItem CI WHERE
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table1**], *, '"[search_string]*"') FT
WHERE FT.[Key] = CI.ContentItem_Id)
**OR EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table2**], *, '"[search_string]*"') FT
WHERE FT.[Key] = CI.ContentItem_Id))
ORDER BY [...]
结果:在SQL 2005上超级快(大约一秒),但在SQL 2008上非常慢(3分钟+)
我知道SQL 2008 FTS的性能问题(即使在stackoverflow上),但还没有找到任何合理的解决方案。
答案 0 :(得分:2)
您可以将查询3重写为
SELECT ... WHERE EXISTS ... CONTAINSTABLE(Table1...)
UNION
SELECT ... WHERE EXISTS ... CONTAINSTABLE(Table2...)
ORDER BY ...
UNION ALL可能比UNION快,但可能导致重复记录。
答案 1 :(得分:1)
你可能会得到一个糟糕的计划。如果您可以发布计划,它将有助于诊断问题。如果选择了错误的连接,您可以使用查询提示来解决问题。
答案 2 :(得分:0)
我们刚刚升级到SQL 2008并遇到了这个问题。我发现如果我把它放在查询的底部,它对我很有用:OPTION(MAXDOP 1)