在频繁执行的存储过程中(有时高达每秒 10-15 次),有两条特定语句显示在按累积 CPU 影响排名前 10 的最重查询中
这些是用于创建 #Temp 表的 DDL 语句:
1.
SELECT cast(0 as int) as rowId
, Column1 as tColumn1
, Column2 as tColumn2
, ...
, Column14 as tColumn14
, cast(0 as datetime) as tUTC
, -1 as tRefId
INTO #TempTable1
FROM Table1 WITH(NOLOCK)
WHERE 0=1
SELECT tColumn1, ..., tColumn14, tUtc, tRefId
INTO #TempTable2
FROM #TempTable1
WHERE 0=1
上述任何 DDL,平均占用 10-15 毫秒 CPU 时间,仅用于创建 #temp 表
更改存储过程的逻辑,使其不创建临时表,不是一种选择
问题:就 CPU 时间而言,如何加快临时表的创建时间?
可能是创建空表的便捷方法,但我希望简单的
CREATE TABLE
DDL 语句更有效。不需要
CREATE TABLE
经过计划编译过程(编译一个简化为从恒定扫描中选择的执行计划)然后执行它。可能更重要的是(对于本次讨论),
CREATE TABLE
存储过程中的版本还可以允许更好地使用SQL Server 临时对象缓存,从而完全避免创建所需的大部分工作。为此,您需要避免某些阻止缓存的结构。有关详细信息,请参阅链接的帖子。其中之一是“在对象创建后执行“DDL”。
CREATE TABLE
允许在创建时以声明方式定义索引和约束。SELECT ... INTO
将要求在创建后添加它们,因此此路由更有可能最终处于表不满足缓存要求的状态。除非处理小型数据集,否则我总是发现在使用 CREATE TABLE #TableName 语法插入数据之前创建临时表更快。如果您要为表建立索引,我总是通过在插入数据后添加它来获得最佳性能。