这是我需要SQL管理员的帮助。我在Amazon EC2上有两个单独的SQL Server实例。一个是我们的暂存环境,另一个是我们的生产环境,但它们的配置方式完全相同(从同一图像中生成)。
我们有一个数据库,我们上周从登台复制到我们的生产环境。我们将数据库复制到生产的方式是在备份站点上对其进行备份,并在生产中恢复备份。无论如何,我们发现在生产中,一个特定的复杂查询在一小时后超时,但我们的暂存环境中的确切查询在10分钟内完成。
关于两者的解释计划几乎相同,除了在一个服务器上它在大表(8M行)上进行PK扫描,而在另一个表上它正在进行索引搜索。我们假设这是不同的。因此,一台服务器正在执行大量磁盘IO,而另一台服务器则没有。
所以我的问题是,一个SQL服务器安装决定使用索引的原因是什么,而另一个忽略它 - 假设SQL服务器版本相同,数据集相同?更好的是,找出SQL忽略索引的最佳方法是什么?
答案 0 :(得分:3)
SQL Server
使用统计信息来确定查询执行计划。
通常情况下,它们在相同数据集上应该相同,但其中一台计算机上可能存在过时的统计信息。
使用sp_updatestats
更新两台计算机上的统计信息。
另外,我不熟悉Amazon EC2
,但运行这两个实例的计算机可能安装了不同数量的CPU
(或{{1}可供使用}})。优化程序也会考虑这一点。
答案 1 :(得分:2)
SP将使用根据第一次执行(并编译)时传递给它的参数而被认为最合适的查询计划。
恢复数据库会擦除计划缓存;如果数据库副本上的SP是使用有利于索引搜索的参数运行的,那么随后将使用的是。
您可以通过sp_recompile
检查这两项并使用相同的参数再次运行它们。
答案 2 :(得分:0)
这是我们的错误。
经过大量挖掘调查后,我们发现我们的一个开发人员在转移后向生产数据库添加了一些额外的索引。这种情况下,附加索引实际上导致查询优化器在生产环境中选择效率较低的路由。
删除这些附加索引似乎已经解决了特定查询的性能问题,现在两个解释计划都是相同的。