我们有一个有趣的问题,我希望有人能够帮助解决一些问题。在高层次上的问题如下:在查询中使用过滤器和CONTAINSTABLE时的执行计划不佳
下面的查询快速执行(1秒):
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
,但如果我们添加了一个筛选的查询,则需要大约2分钟返回:
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
WHERE SA.CHG_DATE>'19 Feb 2010'
看着两个查询执行计划,我可以看到,在第二种情况下有两个地方有,它们是行的实际和估计数之间的巨大差异:
1)对于FulltextMatch表值函数,估计值约为22,000行,实际值为2900万行(然后在连接前将其过滤为1670行)和 2)对于索引查找全文索引,其中估计值为1行,实际值为13,000行
由于估计结果,优化器选择使用嵌套循环连接(因为它假定行数很少),因此计划效率低下。
我们可以通过(a)参数化查询并向查询添加OPTION(OPTIMIZE FOR UNKNOWN)或(b)通过强制使用HASH JOIN来解决问题。在这两种情况下,查询都会在1秒内返回,估计似乎是合理的。
我的问题确实是'为什么这些估计值被用在表现不佳的案例中,因此非常不准确,可以采取哪些措施来改善它们'?
统计信息在此处使用的索引视图上的索引是最新的。
任何帮助非常感谢。
据我所知,这是SQL Server版本的一个问题。该问题表现在SQL Server 2008中,没有Service Pack。将数据库恢复到具有SP1的计算机上,CU5给出了一个不同的(并且更加高效)的执行计划。 – 2010-04-16 22:00:24