2010-04-14 32 views
1

我看不出执行计划有什么问题。此外,据我所知,SQL Server 2000通过识别与现有执行计划的T-SQL语句相关的新T-SQL语句,将存储过程的许多性能优势扩展到所有SQL语句中(通过保留对所有SQL语句的执行计划过程高速缓存,而不仅仅是存储过程执行计划)为什么在不使用存储过程时SQL可以更快地在SQL Server 2000上执行?

这是一个相当直接的SELECT语句,具有敏感的表连接,没有包含事务或在查询中引用链接的服务器,并且应用了WITH(NOLOCK)表提示。存储过程由dbo创建,用户具有所有必需的权限。

所以我的问题是这样的:

什么是可能的原因时,相同的T-SQL通过存储过程运行查询来只需要几秒钟就可以运行,但随后需要几分钟?

回答

2

能想到的两个可能的原因:

  • 存储过程可能会使用过时的执行计划。如果您删除并重新创建存储过程,则其执行计划将被重新编译。
  • 存储过程针对一般情况进行了优化。如果您执行具有特定值的查询,SQL Server可能会为这些值找到更好的执行计划。如果是这种情况,将OPTION (OPTIMIZE FOR UNKNOWN)添加到非过程版本应该会使其变慢。
+0

这发生在特定服务器上的特定数据库上,并为相当多的存储过程这样做。丢弃/重新创建没有效果。使用参数化值运行查询ala NHibernate通常工作得更好(对于我运行的测试),所以这看起来与任何特定值都没有关系。这是制作和“工作”,但这是我想揭穿的东西。 – 2010-04-14 23:02:55

相关问题