SQL Server 是否优化或预解析存储过程?

5 sql-server stored-procedures optimization

尽管 DBA 会告诉您什么(“使用存储过程,因为服务器会优化它们,因此它们比临时查询更快”),但我听说 SQL Server 实际上并没有优化存储过程。

那么,SQL Server 是否优化了存储过程?它甚至事先解析它们,还是只是将它们作为 sql 脚本存储在内部?

我没有询问特定的 SQL Server 版本,因为我认为历史与有意义的理解有关。


请注意,我的问题不是,“即席查询是否与存储过程一样快?” 回答这个问题涉及太多其他因素。

Mar*_*ith 8

SQL Server 执行的所有查询都需要先编译。存储过程在这方面没有什么不同,它们没有得到任何额外的优化。

它们在创建时被解析以检查无效的语法,但在第一次执行之前它们实际上并没有生成执行计划。编译计划时,它将使用在此初始执行中传递的参数值来生成它。这可能会导致参数嗅探问题。

生成的所有执行计划通常会保留在计划缓存中,直到由于内存压力而被逐出或由于模式更改而变得无效或获得基于优化的重新编译。(对于临时查询,“优化临时工作负载”选项可以改变这种行为)。

存储过程的主要好处是对于后续类似的查询,计划更有可能被重用。对于即席查询,这取决于非常保守的自动参数化,因此您很可能最终会针对非常相似的查询进行大量编译,但最终会使用不同的参数值,而这些参数值无论如何都以相同的计划结束。

我在这个答案中遗漏了很多细节。有关完整详细信息,请参阅此计划缓存白皮书


小智 1

据我所知,SQL 将创建执行计划,并将其缓存在数据库中。因此,每当您运行该过程时,都会使用准备好的计划(因此服务器不会再次优化)。在某些情况下,这可以节省大量时间 - (例如,当过程被频繁调用时)。这也可能是缺点 - 编译的计划是在特定条件下创建的,该条件可能会在一段时间内发生变化 - 因此计划可能会过时,从而降低执行性能。