Sql server 执行计划是每批还是每语句?

Sql server 执行计划是每批还是每语句?,sql-server,Sql Server,我一直在微软网站上读这篇文章 它提到 批处理是一组由一个或多个Transact-SQL语句组成的,这些语句同时从应用程序发送到SQL Server以供执行。SQLServer将批处理的语句编译成单个可执行单元,称为执行计划 我认为每个查询(语句)都有自己的执行计划。 执行计划是每批还是每语句 "SQL Server compiles the statements of a batch into a single executable unit, called an execution plan

我一直在微软网站上读这篇文章

它提到

批处理是一组由一个或多个Transact-SQL语句组成的,这些语句同时从应用程序发送到SQL Server以供执行。SQLServer将批处理的语句编译成单个可执行单元,称为执行计划

我认为每个查询(语句)都有自己的执行计划。 执行计划是每批还是每语句

"SQL Server compiles the statements of a batch into a single executable 
unit, called an execution plan. The statements in the execution plan are 
then executed one at a time"  
SQL server为批处理制定执行计划。每个语句都有一个查询计划,它构成执行计划的一部分。您可以通过在单个窗口中运行多个语句并查看查询计划来演示这一点,每个查询计划都有一条标记为“相对于批次”的信息。 混淆可能在于这样一个事实:如果运行一条语句,那么一个查询计划就是整个执行计划。本文假设读者熟悉动态执行计划/查询计划

在这个问题中,从OP链接的文章中可以学到的重要内容是使用批处理的规则。特别是前两项:

--If you CREATE a rule, constraint, or view in the batch, you cannot 
reference   it by another statement in the same batch.

--If you alter a table, you cannot utilize the new schema in a different 
query   in the same batch.
对我来说,这意味着SQL server在执行批处理中的所有语句之前会缓存它们的模式信息,并且在批处理过程中不会更新模式信息


从应用程序到服务器的批处理语句的另一个更重要和更常用的元素是事务的使用。在批处理的任何语句中出现错误时,可以使用事务来管理提交和回滚。这一点在标题为“批处理”一节顶部附近的链接文章中有简要介绍。

如果同时运行两个语句,您会得到一个或两个计划吗?@JacobH我看到两个图表,但我不确定我看到了多少“执行计划”,因为我对执行计划的定义感到困惑。也许它们只是执行计划(批量编译)的一部分(语句编译)?如果我写两份声明,然后开始,也许是一个计划?如果我在每一份声明后都加上围棋,也许会有两个计划?这篇文章还提到了语句级编译。是的,但是当您运行两条语句时,您会得到一个执行计划,可能有多个批处理,包含多个查询计划。@JacobH这很有趣,但同时会让人困惑。不管我是否用“GO”分隔我的两条语句,这两条语句在XML中似乎是分批的。我以为围棋是用来分批的?我还看到,该计划有一个要素包含其他要素;所以执行计划是按照“批次序列”而不是批次来执行的?试试看吧?这个术语没有被重用,只是你用错了。SQL Server使用多个
查询计划构建一个
执行计划
。您可以通过运行两条语句,将计划保存为XML,然后在文本编辑器中打开它来轻松演示这一点。在ManagementStudio中,它们被称为“执行计划”。使其可见的选项有“显示预计执行计划”和“包括实际执行计划”。我相信这个术语正是造成OP混乱的原因。我会更新答案的措辞。