2016-02-08 146 views
1

前几天我被问到这个问题(tel intvw),我被画成空白。我说执行计划存储在服务器中,所以它被称为STORED Procedure。但我不确定我是否正确。为什么sql存储过程被称为存储过程

我以后的研究表明,有多数民众赞成专用于存储执行计划的SQL Server内部计划高速缓存或过程高速缓存。在that article中还有对所谓的编译计划存根的引用。所以看起来,编译计划存根(Compiled Plan Stub)首先被创建,然后执行计划被创建。

所以,我想知道是短暂

  1. 是什么,当我创建一个存储过程中发生的步骤是什么?

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

如果你可以引用我现有的SO问题或其他文章,也应该没问题。

+2

只是一个猜测,但是:它被称为过程,因为...呃...它是一个过程,它被称为存储过程,因为它存储在数据库中(与内置过程相反,或者到专门的T-SQL代码)。 – Heinzi

+0

:),多数民众赞成我的想法当我被问到。但需要更多信息。 – VivekDev

+0

当他们在数据库中甚至需要这个特性是否需要争斗时,我本来会喜欢他们。我很高兴“亲”存储过程的人赢得了这场斗争。 –

回答

1

为什么调用的存储过程

一个存储过程因为它是一个过程存储在数据库中。

在其他语言/环境中,可以执行的过程通常不是存储。它们以字节码或汇编器编译。即该程序不再以其原始文本格式存在。原始程序不能像它在这些环境中创建时那样被检索(尽管逆向工程可以检索该程序的本质)。

当您在SQL Server中的存储过程,它完全存放在原全文形式,相同的压痕,相同的外壳中,相同的路线,包括注释和所有。您可以检索完整创建存储过程的文本。

关于执行存储过程

当SQL Server要执行存储过程简单的解释,它会首先检查缓存,看它是否已经被编译。如果它在缓存中找到条目(以执行计划的形式),它将使用该条目执行。如果它没有找到条目,它会将该过程编译为执行计划,将其存储在高速缓存中供以后使用,然后使用执行计划执行它。

有些情况下强制存储过程被重新编译,例如,当清除执行计划缓存时(模式更改,统计信息更新...)或向编译器提供强制重新编译命令时(存储过程WITH RECOMPILE,查询选项OPTION(RECOMPILE),...)。

2

我说的执行计划存储在服务器,以便其调用的存储过程。

错误。执行计划也存储在服务器上用于动态SQL。我不知道为什么它被称为存储过程,但整个过程存储在服务器上(代码等)。我可以认为这是原因 - 但执行计划(缓存)在这里并不重要,因为所有的执行计划都可能存储在那里。

对于1:你在乎什么?显然一个SQL语句被执行。有一些解析,以确保它是有效的。其余部分是实现细节 - 甚至可能在版本之间有所不同。我会假设一个SP存储在字节码的某个级别 - 但是,谁又在乎呢?我做了25年的数据库级开发,甚至从未考虑过我的考虑。

+0

好的,但你能回答我的第一个问题吗?当我创建存储过程时,会发生什么步骤?是编译计划存根,然后创建执行计划? – VivekDev

+1

哪一部分“不相关”你不明白?要完成所有步骤,您需要使用sql server源代码。即使问这个也没有意义。你命名2个结果 - 这不是步骤。 – TomTom