SQL 2008中临时表和表变量之间的区别是什么?

SQL 2008中临时表和表变量之间的区别是什么?,sql,sql-server,sql-server-2008,tsql,temp-tables,Sql,Sql Server,Sql Server 2008,Tsql,Temp Tables,以下两者之间的区别是什么: CREATE TABLE #temp ( [ID] INT) INSERT INTO #temp SELECT ... 及 在SQL Server 2008中?这是对不同临时表的一个很好的参考 没有表变量的日志 表变量只有局部作用域(不能从不同的过程访问同一个表变量) 不能预编译带有临时表的过程 有关更多详细信息,请参见。临时表在大多数特性上与普通表类似,只是它们进入TempDB而不是当前数据库,并且在有限的范围内消失,(取决于它们是基于会话的临时表还是全局临时

以下两者之间的区别是什么:

CREATE TABLE #temp ( [ID] INT)

INSERT INTO #temp
SELECT ...


在SQL Server 2008中?

这是对不同临时表的一个很好的参考

  • 没有表变量的日志
  • 表变量只有局部作用域(不能从不同的过程访问同一个表变量)
  • 不能预编译带有临时表的过程

  • 有关更多详细信息,请参见。

    临时表在大多数特性上与普通表类似,只是它们进入TempDB而不是当前数据库,并且在有限的范围内消失,(取决于它们是基于会话的临时表还是全局临时表。但是临时表中数据的所有更改都会记录到事务日志中,以及由此产生的所有性能影响。此外,您还可以向临时表添加尽可能多的索引、视图、触发器或任何您想要添加的内容,就像添加到普通表一样。


    表变量是内存表中的一种快捷方式(它们也使用temp DB)。对它们的更改不会被记录(这会提高性能)。但是您只能在它们上获得一个索引,(因为索引不能在初始声明语句之后创建,所以可以在表变量上创建的唯一索引是可以包含在初始表变量声明中的索引

       Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20)) 
    
    由于这些特点,临时表是大型表(宽且具有多行)和/或在其生命周期内将经历多个访问模式的更好选择,而当您需要非常窄的表(仅键表或仅具有一个数据列的键)时,表变量是最佳选择,它将始终由该索引键访问

  • 表变量具有定义良好的作用域。它们将在批处理(即当前语句批处理)结束时自动清除,其中as临时表将对当前会话和嵌套存储过程可见。全局临时表将对所有会话可见

  • 表变量是使用Declare语句创建的。无法使用Declare语句创建表变量

    select * into @tableVariableName
    
    select * into #tempTableName
    
    但我们可以使用CREATETABLE语句和CREATETABLE语句创建临时表

    select * into @tableVariableName
    
    select * into #tempTableName
    
  • 在SQLServer2008以后的版本中,我们可以将表变量作为参数传递给存储过程,但不能将临时表作为参数传递给存储过程

  • 我们可以在UDF(用户定义函数)中使用table变量,但不能在UDF中使用临时表


  • 优化器还假设一个表变量总是正好有一行。@erikkallen不知道这一点;请参考?“您只能在它们上获得一个索引(因为索引不能在初始声明语句之后创建)”--当初始声明语句包含多个已知可物理创建索引的逻辑构造时,例如,这包含两个
    UNIQUE
    s:
    DECLARE@T表(ID1 INTEGER NOT NULL UNIQUE,ID2 INTEGER NOT NULL UNIQUE)
    所以这肯定会创建两个索引,不会记录对
    @table_变量的更改。@Martin:好问题,特别是回答。谢谢!