我的查询在生产环境中运行“很快”,但在测试服务器上却非常慢(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服务器:
答案 0 :(得分:0)
两个服务器可能不相同或配置不同。但是有些不必要的事情,通过比较u删除函数RTRIM()将得到相同的结果。
答案 1 :(得分:0)
将表1和表2复制到新副本后,查询计划与生产版本的解析方式相同,这确实表明基数估计值与原始副本和副本有一些不同。
为表创建的统计信息必须有所不同,因此请检查它们之间是否具有为原始表和副本创建的统计信息。
还要查看直方图以获取统计信息,尤其是与计划之间观察到的不同索引选择有关的统计信息-步骤看起来是否相同?
另外,可能很明显并且您已经确认-但是表上是否存在所有相同的索引?