Sql server 使用SQL临时表的速度与存储过程中的长变量列表

Sql server 使用SQL临时表的速度与存储过程中的长变量列表,sql-server,sql-server-2008,variables,temp-tables,Sql Server,Sql Server 2008,Variables,Temp Tables,我有一个存储过程,其中包含大约50个不同类型的变量,作为不同组(声明、初始化、加载、计算、结果、e.t.c.)的一部分重复了大约8次 为了避免重复,我想改为使用临时表(而不是表变量,这不会带来我寻求的优势-推断类型) 我读到过,临时表可能从“内存表”开始,然后随着内存量和许多其他条件的增长而溢出到磁盘 我的问题是-如果我使用temp table存储和操作一条包含50个字段的记录,它会比使用50个变量慢很多吗?不,不会慢很多;在正常使用情况下,您甚至可能很难显示它的速度较慢 在这种情况下,我总是使

我有一个存储过程,其中包含大约50个不同类型的变量,作为不同组(声明、初始化、加载、计算、结果、e.t.c.)的一部分重复了大约8次

为了避免重复,我想改为使用临时表(而不是表变量,这不会带来我寻求的优势-推断类型)

我读到过,临时表可能从“内存表”开始,然后随着内存量和许多其他条件的增长而溢出到磁盘


我的问题是-如果我使用temp table存储和操作一条包含50个字段的记录,它会比使用50个变量慢很多吗?

不,不会慢很多;在正常使用情况下,您甚至可能很难显示它的速度较慢


在这种情况下,我总是使用临时表;性能差异可以忽略不计,我认为可读性和易用性更好。如果我得到10个以上的变量,我通常会开始考虑使用临时表,尤其是那些相关的变量。

不,不会慢很多;在正常使用情况下,您甚至可能很难显示它的速度较慢


在这种情况下,我总是使用临时表;性能差异可以忽略不计,我认为可读性和易用性更好。如果我得到10个以上的变量,我通常会开始考虑使用临时表,尤其是那些相关的变量。

不,不会慢很多;在正常使用情况下,您甚至可能很难显示它的速度较慢


在这种情况下,我总是使用临时表;性能差异可以忽略不计,我认为可读性和易用性更好。如果我得到10个以上的变量,我通常会开始考虑使用临时表,尤其是那些相关的变量。

不,不会慢很多;在正常使用情况下,您甚至可能很难显示它的速度较慢

在这种情况下,我总是使用临时表;性能差异可以忽略不计,我认为可读性和易用性更好。如果我得到10个以上的变量,我通常会开始考虑使用临时表,尤其是那些相关的变量。

除非我需要为多行存储临时结果,否则我不会使用临时表。我们的代码在一些存储过程中使用了很多变量。在声明期间初始化的功能有助于减少混乱

临时表在查询编译方面有一些有趣的副作用。如果存储过程调用任何子过程,并且子过程中的查询引用此#表,则每次执行时都会重新编译这些查询

另外,请注意,如果以任何方式修改临时表模式,SQL Server将无法缓存表定义。在引用该表的每个查询中,都会受到查询重新编译的惩罚。此外,SQL Server在不断创建和删除表元数据时,还会敲打各种系统表

另一方面,如果您不调用child procs,并且不更改#表模式,那么它可能执行正常

但是从风格上讲,仅仅为了在
WHERE
子句中使用变量而向查询中添加另一个连接对我来说没有意义。换言之,我更希望看到这样的情况:

declare @id

select @id = ...

select tbl.id, ...
from tbl
inner join tbl2 ...
where tbl.id = @id
与此相反:

create table #VarTbl (...)

insert into #VarTbl (...) select ...

select tbl.id, ...
from tbl
inner join tbl2 ...
cross join #VariableTable
where tbl.id = VarTbl_ID
另一个想法是:能否将存储过程分解为逻辑操作组?这可能有助于提高可读性。它还可以帮助减少查询重新编译。如果需要重新编译一个子进程,这不会影响父进程或其他子进程。

除非需要存储多行的临时结果,否则我不会使用临时表。我们的代码在一些存储过程中使用了很多变量。在声明期间初始化的功能有助于减少混乱

临时表在查询编译方面有一些有趣的副作用。如果存储过程调用任何子过程,并且子过程中的查询引用此#表,则每次执行时都会重新编译这些查询

另外,请注意,如果以任何方式修改临时表模式,SQL Server将无法缓存表定义。在引用该表的每个查询中,都会受到查询重新编译的惩罚。此外,SQL Server在不断创建和删除表元数据时,还会敲打各种系统表

另一方面,如果您不调用child procs,并且不更改#表模式,那么它可能执行正常

但是从风格上讲,仅仅为了在
WHERE
子句中使用变量而向查询中添加另一个连接对我来说没有意义。换言之,我更希望看到这样的情况:

declare @id

select @id = ...

select tbl.id, ...
from tbl
inner join tbl2 ...
where tbl.id = @id
与此相反:

create table #VarTbl (...)

insert into #VarTbl (...) select ...

select tbl.id, ...
from tbl
inner join tbl2 ...
cross join #VariableTable
where tbl.id = VarTbl_ID
另一个想法是:能否将存储过程分解为逻辑操作组?这可能有助于提高可读性。它还可以帮助减少查询重新编译。如果需要重新编译一个子进程,这不会影响父进程或其他子进程。

除非需要存储多行的临时结果,否则我不会使用临时表。我们的代码在一些存储过程中使用了很多变量。在声明期间初始化的功能有助于减少混乱

临时表在查询编译方面有一些有趣的副作用。如果存储过程调用任何子过程,并且子过程中的查询引用此#表,则每次执行时都会重新编译这些查询

另外,请注意,如果以任何方式修改临时表模式,SQL Server将无法缓存表定义。在引用该表的每个查询中,都会受到查询重新编译的惩罚。此外,SQL Server在不断创建和删除表元数据时,还会敲打各种系统表

另一方面,如果你