我有一个正在尝试优化的存储过程,它接受表变量作为参数。表变量具有单个列,用于传入主键列表。测试时,我创建一个虚拟表变量,运行一堆 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/