sql - 如何在 SSMS 中显示批量中单个查询的实际查询计划?

标签 sql sql-server database ssms sql-optimization

我有一个正在尝试优化的存储过程,它接受表变量作为参数。表变量具有单个列,用于传入主键列表。测试时,我创建一个虚拟表变量,运行一堆 INSERT 语句向其中添加虚拟值,然后将其传递到存储过程中。这工作正常,但是当我想查看实际的查询执行计划时,SSMS 会为所有 INSERT 语句和存储过程编译查询计划。因此,如果我有 1000 个虚拟 INSERT 语句,SSMS 将崩溃。不幸的是,表变量必须与存储过程在同一批中执行,因此我无法批量启用/禁用查询计划。

有没有办法只编译存储过程的实际查询计划,忽略批处理中的所有 INSERT 语句?

它看起来像这样:

DECLARE @dummyIds AS PrimaryKeyTable
INSERT INTO @dummyIds VALUES(1)
INSERT INTO @dummyIds  VALUES(2)
...
INSERT INTO @dummyIds VALUES(1000)

EXEC MyStoredProc @dummyIds

如果我执行包含实际查询计划的批处理,它将生成 1001 个查询计划,而我实际上只想要 1。

SQL Server 实例正在运行 SQL SERVER 2014。

最佳答案

实现此目的的一种方法是不依赖 SSMS 生成请求查询计划,而是仅在测试批处理中的所需点执行此操作。为此,只需手动插入 SET STATISTICS XML在要分析的查询之前添加指令并在之后禁用它,并保持 SSMS 中的选项禁用。

类似的事情就可以了:

DECLARE @dummyIds AS PrimaryKeyTable
INSERT INTO @dummyIds VALUES(1)
INSERT INTO @dummyIds  VALUES(2)
...
INSERT INTO @dummyIds VALUES(1000)

SET STATISTICS XML ON          --Enable plan generation
EXEC MyStoredProc @dummyIds
SET STATISTICS XML OFF         --Disable plan generation

这样服务器将仅返回中间代码的查询计划。在内部,SSMS 会对整个批处理执行此操作。请注意,进行此更改后,SSMS 不会在结果面板中显示“执行计划”选项卡,而是返回带有单独 XML 文档的额外结果集(或更准确地说,每个计划一个)。您必须手动单击这些按钮,然后 SSMS 将显示其图形计划。

关于sql - 如何在 SSMS 中显示批量中单个查询的实际查询计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544344/

相关文章:

java - 如何在 Birt 报告中将字符串转换为时间/分钟?

asp.net - 为 ASP .NET 网站部署数据库

mysql - 如何减少mysql查询执行时间

sql-server - SQL Server 用户太多

mysql - 从数据库中存储的完整路径中提取目录名

SQL PIVOT 仅一列

java - SQL Server 中的 hibernate 连接

sql - 如何使用 Coalesce 和 Max 提取不为空的最大值列

mysql - 仅当一个字段不为 NULL 时才对 MySQL 条目进行分组,否则另一个字段带有 CASE

mysql - 设置变量等于MySQL中的列