前几天我被问到这个问题(tel intvw),我被空白了。我说执行计划存储在服务器中,因此称为STORED Procedure。但我不确定我是否正确。
之后的研究表明,SQL Server内部有计划缓存或过程缓存,专门用于存储执行计划。在that article中,还提到了所谓的编译计划存根。因此,首先创建编译计划存根,然后创建执行计划。
所以我想知道的是简短的
创建存储过程时会发生什么步骤?
为什么存储过程称为存储过程(如果问题有意义)?
如果您可以将我推荐给现有的SO问题或其他文章,那也应该没问题。
答案 0 :(得分:2)
我说执行计划存储在服务器中,因此称为STORED Procedure。
错误。执行计划也存储在服务器上以用于动态SQL。我不知道为什么它被称为存储过程,但整个过程存储在服务器上(代码等)。我可以假设这是原因 - 但执行计划(缓存)在这里是无关紧要的,因为所有执行计划都可能存储在那里。
1:你在乎什么?显然,执行了一个SQL语句。有一些解析,以确保它是有效的。其余部分是实现细节 - 甚至可能在版本之间有所不同。我假设一个SP存储在某种程度的字节码中 - 但是,谁又关心?我做了25年的数据库级开发,甚至从未考虑过。
答案 1 :(得分:2)
为什么存储过程称为存储过程
因为程序在数据库中存储。
在其他语言/环境中,可以执行的程序通常存储。它们以字节码或汇编语言编译。即该程序不再以其原始文本形式存在。原始过程无法像在这些环境中创建时那样检索(尽管逆向工程可以检索该过程的本质)。
在SQL Server中创建存储过程时,它完全以原始的全文形式,相同的缩进,相同的大小写,相同的行,包括注释等全部存储。您可以完整地检索用于创建存储过程的文本。
关于执行存储过程的简化说明
当SQL Server想要执行存储过程时,它将首先检查缓存以查看它是否已经编译。如果它在缓存中找到一个条目(以执行计划的形式),它将使用此条目来执行。如果它没有找到条目,它会将程序编译成执行计划,将其存储在缓存中供以后使用,然后使用执行计划执行它。
有些情况会强制重新编译存储过程,例如清除执行计划缓存(架构更改,统计信息更新,...)或向强制重新编译的编译器提供命令时(存储过程WITH RECOMPILE
,查询选项OPTION(RECOMPILE)
,...)。