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 时间而言)?
SELECT ... INTO ... WHERE 0=1
Run Code Online (Sandbox Code Playgroud)
可能是创建空表的便捷方法,但我希望有一个简单的方法CREATE TABLEDDL 语句会更有效。
没有必要CREATE TABLE计划编译过程(编译一个简化为从恒定扫描中选择的执行计划)然后执行它。
可能更重要的是(对于本次讨论)CREATE TABLE存储过程内的版本也可能允许更好地使用SQL Server 临时对象缓存,从而避免创建所需的大部分工作。
为此,您需要避免某些阻止缓存的结构。有关更多详细信息,请参阅链接的帖子。其中之一是“在对象创建后执行“DDL””。
CREATE TABLE允许在创建时以声明方式定义索引和约束。
SELECT ... INTO需要在创建后添加它们,因此此路由更有可能最终处于表不满足缓存要求的状态。