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))
由于这些特点,临时表是大型表(宽且具有多行)和/或在其生命周期内将经历多个访问模式的更好选择,而当您需要非常窄的表(仅键表或仅具有一个数据列的键)时,表变量是最佳选择,它将始终由该索引键访问
select * into @tableVariableName
select * into #tempTableName
但我们可以使用CREATETABLE语句和CREATETABLE语句创建临时表
select * into @tableVariableName
select * into #tempTableName
优化器还假设一个表变量总是正好有一行。@erikkallen不知道这一点;请参考?“您只能在它们上获得一个索引(因为索引不能在初始声明语句之后创建)”--当初始声明语句包含多个已知可物理创建索引的逻辑构造时,例如,这包含两个
UNIQUE
s:DECLARE@T表(ID1 INTEGER NOT NULL UNIQUE,ID2 INTEGER NOT NULL UNIQUE)
所以这肯定会创建两个索引,不会记录对@table_变量的更改。@Martin:好问题,特别是回答。谢谢!