【发布时间】:2018-07-26 17:19:05
【问题描述】:
我有一个正在尝试优化的存储过程,它接受一个表变量作为参数。表变量只有一列,用于传入主键列表。测试时,我创建了一个虚拟表变量,运行一堆 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。
【问题讨论】:
-
将所有值放入一个插入中。
标签: sql sql-server database ssms sql-optimization