2010-05-27 100 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連接 可見。