为什么SQL存储过程被称为存储过程?

4
几天前我被问到这个问题(tel intvw),但是我无法回答。 我说执行计划存储在服务器中,因此称为存储过程。 但我不确定我是否正确。
我之后的研究表明,在SQL Server内部有一个专门用于存储执行计划的计划缓存或过程缓存。 在那篇文章中还提到了所谓的编译计划存根。 因此,似乎先创建编译计划存根,然后再创建执行计划。
所以我想简要知道以下内容:
  1. 创建存储过程时发生了什么步骤?

  2. 存储过程为什么被称为存储过程(如果这个问题有意义)?

如果您可以指导我现有的SO问题或其他文章,那也可以。

2
只是猜测,但是:它被称为过程,因为...嗯...它确实是一个过程,并且被称为存储过程,因为它存储在数据库中(与内置过程或即席T-SQL代码相对)。 - Heinzi
当我被问到这个问题时,我的脑海里浮现了一个笑脸。但是需要更多的信息。 - VivekDev
我很想在他们就数据库是否需要该功能进行争论时在场。我很高兴“专业”存储过程人员赢得了这场战斗。 - Sql Surfer
2个回答

3
因为它是一个被储存在数据库中的过程,所以称之为“Stored Procedure”。
在其他语言/环境中,可以执行的过程通常不会被“存储”。它们编译成字节码或汇编语言。也就是说,该过程不再以原始文本形式存在。在这些环境中,无法检索创建该过程时的原始过程(尽管可以通过反向工程来检索该过程的本质)。
当您在SQL Server中创建存储过程时,它完全以其原始全文形式存储,包括缩进、大小写、行数和所有注释等。您可以完整地检索创建存储过程时使用的文本。
在SQL Server要执行存储过程时,它会首先检查缓存以查看是否已经编译。如果在缓存中找到一个条目(以执行计划的形式),则使用该条目进行执行。如果未找到条目,则将过程编译成执行计划,并将其存储在缓存中以供以后使用,然后使用执行计划执行它。
有一些情况会强制重新编译存储过程,例如:清除执行计划缓存(模式更改、统计数据更新等)、或者提供强制重新编译的命令(存储过程 “WITH RECOMPILE”、查询选项 “OPTION(RECOMPILE)”等)。

2
我说执行计划存储在服务器上,所以称为存储过程。
错误。动态SQL的执行计划也存储在服务器上。我真的不知道为什么它被称为存储过程,但整个过程都存储在服务器上(代码等)。我可以假设这是原因,但执行计划(缓存)在这里是无关紧要的,因为所有执行计划都可能存储在那里。
至于第一个问题:你关心什么?显然,SQL语句被执行。有一些解析,以确保它是有效的。其余部分是实现细节 - 可能甚至在版本之间有所变化。我会假设存储过程存储在某个字节码级别上 - 但再次,谁关心呢?我从事数据库开发已经25年了,这甚至从未引起我的注意。

好的,但是你能回答我的第一个问题吗?当我创建存储过程时会发生哪些步骤?是编译计划存根,然后创建执行计划吗? - VivekDev
1
“无关”的哪个部分你不明白?要拥有所有步骤,您需要 SQL Server 源代码。甚至询问这个问题都没有意义。您列出了 2 个结果 - 这些不是步骤。 - TomTom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接