Sql Server 2008 R2 - SSMA转换了影响性能的扩展过程调用(IMPL过程)

时间:2010-11-11 13:51:23

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我们正在开发Oracle to SQL Server 2008迁移项目。所以我们有很多用于调用其他存储过程的oracle包函数。这些函数已由SSMA转换为IMPL过程,这些过程通过函数的扩展过程执行。我们已经将大多数此类函数转换为简单的UDF。现在我们面临着一个特殊的性能问题。使用IMPL过程调用调用此类函数的查询运行时间较长。有趣的是,相同的查询用于在2分钟内在Sql Server 2008的旧服务器上运行。现在在使用SQL Server 2008 R2的新服务器中,它需要很长时间(大约25-30分钟)。

我们已验证索引和统计信息也是最新的。我们还注意到IMPL调用通过master和sysdb数据库并使用内部表来存储并将结果从IMPL过程调用传递回函数。他们的空间分配与旧服务器不同。但它们并没有耗尽空间。他们可以造成这个问题吗?是否有可用于master / sysdb数据库空间分配的指南?

数据库大约为300GB,tempdb大约为50GB。

旧服务器

  • SQL Server 2008 / Windows
  • Xenon Quad Core x4 - 3GHz,64GB RAM

新服务器

  • SQL Server 2008 R2 RTM
  • Opteron 6核心x6 - 2.2GHz,64GB RAM

如果需要更多详细信息,请与我们联系。

由于

1 个答案:

答案 0 :(得分:0)

SQL Server中的用户定义函数不仅仅是可以返回值的SP(例如,它们无法修改数据库表)。 Oracle函数可以基本上与程序可以做的相同。因此,很多Oracle函数都被转换为func_name $ IMPL存储过程+一些包装器函数(根据我记忆,它通过SSMA特定的扩展SP调用相应的$ IMPL过程)。在可能的情况下,SSMA将尽量避免直接调用函数(生成对相应的... $ IMPL SP的调用),但有些情况不包括在内。那些更难的情况将导致直接调用生成的包装函数。我相信它们确实相当缓慢:(在您的情况下,SSMA发现没有更好的自动转换...因此您应该尝试更改生成的SQL Server代码以直接使用func_name $ IMPL存储过程(只是使用普通的EXEC,而不是尽可能多地调用包装函数,直到性能对你来说很好)。