相同查询/数据的MSSQL Diferent执行计划

时间:2018-10-09 10:50:41

标签: sql sql-server sql-execution-plan

我的查询在生产环境中运行“很快”,但在测试服务器上却非常慢(1小时)。

正在查询以下查询:

select z.PrimaryKeyColumn
FROM [table1] z 
inner join Table2 p on  p.PrimaryKeyColumn=z.PrimaryKeyColumn
left outer join table3 pz on z.PrimaryKeyColumn==Rtrim(rtrim(pz.column2)+LTRIM(pz.column3))

我分析了查询执行计划,并意识到在生产中它使用哈希匹配,而在测试中它使用循环进行第一次连接,因此很慢。 我已经重建了索引并更新了统计信息,但是结果是一样的。

此外,在测试速度较慢的TEST服务器上,我使用索引和数据复制/复制了Table2表,当我使用该表时,查询与在生产服务器上的查询一样快...

这是查询执行计划:

测试服务器:

TEST服务器,但在INNER JOIN中使用Table2的副本:

PRODUCTION服务器:

2 个答案:

答案 0 :(得分:0)

两个服务器可能不相同或配置不同。但是有些不必要的事情,通过比较u删除函数RTRIM()将得到相同的结果。

答案 1 :(得分:0)

将表1和表2复制到新副本后,查询计划与生产版本的解析方式相同,这确实表明基数估计值与原始副本和副本有一些不同。

为表创建的统计信息必须有所不同,因此请检查它们之间是否具有为原始表和副本创建的统计信息。

还要查看直方图以获取统计信息,尤其是与计划之间观察到的不同索引选择有关的统计信息-步骤看起来是否相同?

另外,可能很明显并且您已经确认-但是表上是否存在所有相同的索引?