这里有一个我需要来自SQL管理员的帮助。我在亚马逊EC2上有两个独立的SQL Server实例。一个是我们的登台环境,另一个是我们的生产环境,但它们的配置方式是完全相同的(从相同的映像派生)。
我们有一个数据库,上周从暂存环境复制到生产环境中。我们将数据库复制到生产环境的方法是在临时站点上对其进行备份,然后在生产环境中恢复该备份。无论如何,我们发现在生产环境中,一个特定的复杂查询在一个小时后超时,但在我们的临时环境中,该查询在10分钟内完成。
这两个表上的explain计划几乎相同,除了在一个服务器上对一个大表(8M行)执行PK扫描,而在另一个表上执行索引查找。我们假设这就是区别所在。因此,一台服务器执行大量磁盘IO,而另一台则不是。
所以我的问题是,假设SQL server的版本相同,数据集相同,那么一个SQL server安装决定使用索引,而另一个安装忽略它的原因是什么?更好的是,找出SQL忽略索引的最好方法是什么?
发布于 2011-04-25 13:16:43
这是我们的错误。
经过大量的深入调查,我们发现我们的一个开发人员在传输后向生产数据库添加了几个额外的索引。在这种情况下,额外的索引实际上会导致查询优化器在生产环境中选择效率较低的路由。
删除这些额外的索引似乎已经解决了特定查询的性能问题,并且两个解释计划现在是相同的。
发布于 2011-04-21 12:53:49
SQL Server
使用统计信息来确定查询执行计划。
通常,它们在相同的数据集上应该是相同的,但其中一台机器上的统计数据可能会过时。
使用sp_updatestats
更新两台计算机上的统计信息。
另外,我不熟悉Amazon EC2
,但运行这两个实例的机器可能安装了不同数量的CPU
(或可供SQL Server
使用)。优化器也会考虑到这一点。
发布于 2011-04-21 13:02:38
SP将根据第一次执行(编译)时传递给它的参数,使用被认为是最合适的查询计划。
恢复数据库将擦除计划缓存;如果数据库副本上的SP是使用有利于索引查找的参数运行的,则随后将使用该参数。
您可以通过sp_recompile
这两个命令并使用相同的参数再次运行它们来检查这一点。
https://stackoverflow.com/questions/5744336
复制