我们遇到SQL Server(2008 R2)全文搜索的性能问题。当我们在全文搜索条件中有其他条件时,它会变得太慢。
这是我的简化查询:
SELECT * FROM Calls C
WHERE (C.CallTime BETWEEN '2013-08-01 00:00:00' AND '2013-08-07 00:00:00')
AND CONTAINS(CustomerText, '("efendim")')
调用表的主键是CallId(int,clustered index)以及CallTime索引的Calls表。我们有16.000.000行,CustomerText每行大约10KB。
当我看到执行计划时,首先找到全文搜索结果集,然后通过CallId与Calls表连接。因此,如果第一个结果集有更多行,则查询会变慢(超过一分钟)。
这是执行计划:
当我单独运行条件时,它会为CallTime条件返回360.000行:
SELECT COUNT(*) FROM Calls C
WHERE (C.CallTime BETWEEN '2013-08-01 00:00:00' AND '2013-08-07 00:00:00')
包含条件的和1.200.000行:
SELECT COUNT(*) FROM Calls C
WHERE CONTAINS(AgentText, '("efendim")')
那么,我该怎么做才能提高查询的效果呢?
答案 0 :(得分:0)
如果您根据他们的通话时间对Calls
编制索引并进行了排序,而不是调用:
WHERE (C.CallTime BETWEEN '2013-08-01 00:00:00' AND '2013-08-07 00:00:00')
您可以找到第一个索引,其通话时间大于'2013-08-01 00:00:00'
,最后一个索引小于'2013-08-07 00:00:00'
你的新条件是:
WHERE (C.CallTime BETWEEN first_index AND last_index)
比比较日期更快。