【问题标题】:Is execution plan per-batch or per-statement?执行计划是按批次还是按语句?
【发布时间】:2018-02-08 20:25:06
【问题描述】:

我一直在微软网站https://technet.microsoft.com/en-us/library/ms175502(v=sql.105).aspx阅读这篇文章。

提到

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

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

【问题讨论】:

  • 如果你同时运行两条语句,你会得到一个还是两个计划?
  • @JacobH 我看到了两个图表,但我不确定我看到了多少“执行计划”,因为我对执行计划的定义感到困惑。也许它们只是执行计划(批量编译)的一部分(语句编译)?如果我放两个语句然后放一个 GO,也许是一个计划?如果我在每条语句之后加上 GO,也许有两个计划?文章也提到了语句级编译。
  • 是的,但是当您运行两条语句时,您会得到一个执行计划,可能有多个批次,包含多个查询计划 i>.
  • @JacobH 这很有趣,但同时也令人困惑。不管我是否用“GO”分隔我的两个语句,这两个语句似乎在 XML 中是分开的。我以为GO是用来分批的?我还看到该计划有一个 元素包裹其他元素;所以执行计划是按“批处理序列”而不是批处理?
  • 试试看?

标签: sql-server


【解决方案1】:
"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 服务器为批处理制定一个执行计划。每个语句都有一个构成执行计划一部分的查询计划。您可以通过在单个窗口中运行多个语句并查看查询计划来证明这一点,每个查询计划都有一条标记为“相对于批处理”的信息。 混淆可能在于如果您运行单个语句,您的一个查询计划就是整个执行计划。 OP 引用的文章假设读者熟悉执行计划/查询计划动态。

从问题中由 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 服务器在执行批处理之前缓存了批处理中所有语句的架构信息,并且在处理批处理时不会更新架构信息。

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

【讨论】:

  • 这个词没有被重用,你只是用错了。 SQL Server 使用多个 Query Plans 构建一个 Execution Plan。您可以通过运行两条语句轻松演示这一点,将计划保存为 XML,然后在文本编辑器中打开它。
  • 在管理工作室中,它们被称为“执行计划”。使它们可见的选项是“显示估计执行计划”和“包括实际执行计划”。我相信这个术语是造成 OP 混乱的原因。我会更新答案的措辞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多