【问题标题】:Why might SQL execute more quickly on SQL Server 2000 when NOT using a stored procedure?为什么不使用存储过程时 SQL 在 SQL Server 2000 上执行得更快?
【发布时间】:2011-02-08 03:38:33
【问题描述】:

我看不出执行计划有什么问题。此外,据我了解,SQL Server 2000 通过识别针对现有执行计划的 T-SQL 语句的新 T-SQL 语句(通过保留所有 SQL 语句的执行计划),将存储过程的许多性能优势扩展到所有 SQL 语句。过程缓存,而不仅仅是存储过程执行计划)

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

所以我的问题是这样的:

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

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-execution-plan


    【解决方案1】:

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

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

    【讨论】:

    • 这发生在特定服务器上的特定数据库上,并且对于相当多的存储过程都是如此。删除/重新创建没有效果。使用参数化值 ala NHibernate 运行查询通常效果更好(对于我运行的测试),因此这似乎与任何特定值无关。这是在生产和“工作”,但我想揭开它的神秘面纱。
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2016-10-16
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多