|
|
1
6
更新#2:我还有一个步骤要补充,那应该会让一切变得更清楚。生成计划信息后,运行以下语句(使用正确的计划句柄)查看ShowPlan XML。
提及-在“执行计划”和“查询计划”之间存在差异。这似乎清楚地表明了我们在所有场景中实际看到的部分 查询。 sys.dm_exec_query_stats at MSDN, SQL 2008 sys.dm_exec_query_plan at MSDN, SQL 2008 因此,有了所有这些信息,返回的计划句柄就是执行计划;这些部分是查询计划项。
更新:
gbn 的答案似乎是正确的,至少就我在这里测试的内容而言。有趣的东西。
格特·德雷普斯的后一句话似乎是错误的——这是我的测试。我在这里使用的是SQL2005。在我的测试中,我看到为同一存储过程的不同部分生成了两个查询计划。 首先,我创建了两个表, tblTag1 和 . 我使它们有点相似,这样我的存储过程就可以在两个表之间切换,并以相同的结果表布局返回结果。
第二,存储过程。在存储过程中,我根据参数从一个或另一个表中进行选择。
我向每个表中添加了一些数据,然后以0或1作为参数运行存储过程几十次。 接下来,我运行这个查询来检查生成的查询计划。如果有人对我的草率行为感到不满,我很抱歉——当然,这不是生产代码。
当我运行这个查询时,我看到了一堆计划,但是因为我已经运行了几十次存储过程,不同的部分最终位于顶部。
我只包含了这两行,但希望这足够简单,其他人可以验证我的结果。如果您像我一样使用SQL管理工具,您可能会看到其他行;可能是浏览表格或其他活动引起的。 |
|
|
2
5
我们都是对的:-)
来自MSDN/BOL“ Execution Plan Caching and Reuse "
|
|
|
3
2
我相信这里所指的是存储过程有一个整体查询计划,该计划由各个语句的查询计划组成。换句话说,有一个与之相关的计划 每个 陈述 . (另外,您不需要使用EXEC(..)或sp_ExecuteSQL()来获取此信息)。 因此,如果您使用if来分支到不同的查询语句,那么是的,您可以利用不同的计划。但是,如果您只是使用if设置不同的变量值,然后所有变量都由相同的SQL语句执行,使用这些变量,那么实际上您只有一个查询计划。 |
|
|
4
1
据我所知,每个存储过程或整个查询都会生成一个计划,根据SQL的哈希进行缓存,并在此基础上从缓存中检索。
在此基础上,你可以得到多个计划。该条案文如下:
|
|
|
Johnny T · 基于当前值的SQL合并表[重复] 1 年前 |
|
John D · 需要为NULL或NOT NULL的WHERE子句 1 年前 |
|
ojek · 如何对SQL结果进行分组和编号? 1 年前 |
|
|
senek · 如何在PL/SQL中将选择结果(列)放入数组中 1 年前 |
|
|
Sax · 规范化Google表格(第一步) 1 年前 |
|
|
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 1 年前 |
|
|
Andrus · 如何在sql中查找第二个匹配项 1 年前 |