如何减少临时表创建时间(就 CPU 时间而言)?

Ale*_*sko 3 performance sql-server temporary-tables sql-server-2017

在频繁执行的存储过程(有时每秒高达 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
Run Code Online (Sandbox Code Playgroud)
SELECT    tColumn1, ..., tColumn14, tUtc, tRefId
INTO    #TempTable2
FROM    #TempTable1
WHERE    0=1
Run Code Online (Sandbox Code Playgroud)

上述任何 DDL 平均需要 10-15 毫秒的 CPU 时间,只需创建一个 #temp 表
更改存储过程的逻辑,使其不创建临时表,不是一个选项

问题:如何加快临时表的创建时间(就 CPU 时间而言)?

Mar*_*ith 9

SELECT  ...  INTO  ... WHERE 0=1
Run Code Online (Sandbox Code Playgroud)

可能是创建空表的便捷方法,但我希望有一个简单的方法CREATE TABLEDDL 语句会更有效。

没有必要CREATE TABLE计划编译过程(编译一个简化为从恒定扫描中选择的执行计划)然后执行它。

可能更重要的是(对于本次讨论)CREATE TABLE存储过程内的版本也可能允许更好地使用SQL Server 临时对象缓存,从而避免创建所需的大部分工作。

为此,您需要避免某些阻止缓存的结构。有关更多详细信息,请参阅链接的帖子。其中之一是“在对象创建后执行“DDL””。

CREATE TABLE允许在创建时以声明方式定义索引和约束。

SELECT ... INTO需要在创建后添加它们,因此此路由更有可能最终处于表不满足缓存要求的状态。