2010-05-27 57 views
106

SQL Server中的本地和全局临时表有什么区别?SQL Server中的本地和全局临时表

+1

下面是一些总结这个细节,[点击这里](http://jayeshsorathia.blogspot.com/2012/03/beginning-sql-difference-between-local.html)使用表时 – 2012-03-28 11:52:20

+4

要小心变量。如果您在查询中使用它们,那么它们可能会导致您的查询计划出现严重的性能问题,因为它们未被编入索引。 – 2013-01-03 03:25:15

+0

实际上,如果需要,临时表可以编入索引,但同样需要时间和资源,所以它仍然可能导致性能或资源问题。 – 2016-09-12 16:32:14

回答

80

我觉得这个解释很清楚(这是纯粹的副本从Technet):

有两种类型的临时表:本地和全局。本地临时表在与SQL Server实例的相同连接期间仅与创建者或第一次创建表时的创建者可见。在用户从SQL Server实例断开连接后删除本地临时表。全局临时表对任何用户以及任何创建后的连接都是可见的,并且当引用表的所有用户都从SQL Server实例断开时,全局临时表将被删除。

+0

好的,有用的答案!我一直在寻找有关全球临时表是否被SQL Server自动清理的具体信息。 – kwill 2015-06-25 18:21:32

9

从联机丛书报价:

本地临时表仅在当前会话中可见;全局临时表对所有会话均可见。当他们走出去的范围

临时表自动被删除,除非使用DROP TABLE显式删除:

  • 在存储过程中创建的本地临时表的存储过程完成时自动删除。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建表的存储过程的进程无法引用该表。
  • 所有其他本地临时表在当前会话结束时自动删除。
  • 当创建表的会话结束并且所有其他任务停止引用时,全局临时表会自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期中进行维护。这意味着在完成创建会话结束时主动引用表的最后一个Transact-SQL语句时会删除全局临时表。
247
  • 表变量DECLARE @t TABLE)仅创建它的连接是可见的,并且当所述批处理或存储过程结束被删除。

  • 本地临时表CREATE TABLE #t)只对创建它的 连接可见,当连接 关闭被删除。

  • 全局临时表CREATE TABLE ##t)是给大家, 可见,当已引用它们的所有连接已经关闭被删除。

  • 临时数据库永久表USE tempdb CREATE TABLE t)是可见的 大家,并重新启动服务器时被删除。

+37

另外值得指出的是:当创建它们的作用域关闭时,本地临时表将被删除。所以,如果你在一个存储过程中创建一个本地临时表,然后尝试在存储过程之外访问它 - 它将不存在。对于Will, – 2013-04-24 03:59:29

+0

+1。我试图使用本地临时表作为优化器,我试图使用存储过程作为“创建并填充,如果它不存在”初始值设定项。正如你所说,除非您使用全局临时表,否则它不起作用。 – quillbreaker 2013-12-24 21:06:29

+8

+1包含tempdb永久表。 – CoderDennis 2014-10-15 16:01:53

9

1。)本地临时表表仅在连接期间存在,或者如果在复合语句中定义,则在复合语句的持续时间内存在。

本地临时表仅适用于创建表的SQL Server会话或 连接(表示单个用户)。当创建表的会话已关闭 时,会自动删除这些 。本地临时表名称使用单个散列 (“#”)标志。

CREATE TABLE #LocalTemp 
(
UserID int, 
Name varchar(50), 
Address varchar(150) 
) 
GO 
insert into #LocalTemp values (1, 'Name','Address'); 
GO 
Select * from #LocalTemp 

本地临时表的范围存在于当前 用户的当前会话装置与当前查询窗口。如果您将关闭当前的 查询窗口或打开一个新的查询窗口,并尝试找到上面创建的临时表 ,它会给你错误。


2)全局临时表保持永久数据库,但只能在给定的连接存在的行。当连接关闭时,全局临时表中的数据将消失。但是,下次打开数据库时,表定义将保留在数据库中以供访问。

全局临时表可用于所有SQL Server会话或 连接(意味着所有用户)。这些可以由任何SQL 服务器连接用户创建,当SQL Server连接全部关闭后,这些会自动删除。全局临时表 名称使用双重散列(“##”)符号。而本地临时表仅当前的SQL Server 连接可见

CREATE TABLE ##GlobalTemp 
(
UserID int, 
Name varchar(50), 
Address varchar(150) 
) 
GO 
insert into ##GlobalTemp values (1, 'Name','Address'); 
GO 
Select * from ##GlobalTemp 

全局临时表是所有SQL Server连接 可见。