2009-10-22 82 views
2

我正在解決一個討厭的存儲過程,並且注意到在運行它之後,我關閉了會話,很多臨時表仍留在tempdb中。它們名稱類似以下內容:SQL Server 2005中的臨時表不會自動丟失

#000E262B 
#002334C4 
#004E1D4D 
#00583EEE 
#00783A7F 
#00832777 
#00CD403A 
#00E24ED3 
#00F75D6C 

如果我運行此代碼:

if object_id('tempdb..#000E262B') is null 
print 'Does NOT exist!' 

我得到:

Does NOT exist! 

如果我做的:

use tempdb 
go 
drop TABLE #000E262B 

我得到錯誤:

Msg 3701, Level 11, State 5, Line 1 
Cannot drop the table '#000E262B', because it does not exist or you do not have permission. 

我以系統管理員身份連接到SQL Server。使用SP3 64位。我目前在tempdb中有超過1100個這樣的表,我無法擺脫它們。數據庫服務器上沒有其他用戶。

在我的情況下,停止和啓動SQL Server不是一個選項。

謝謝!

+1

你在哪裏看到表格仍然存在呢? – 2009-10-22 13:49:07

+1

使用tempdb 去 select * from INFORMATION_SCHEMA.tables – 2009-10-22 14:01:59

回答

8

http://www.sqlservercentral.com/Forums/Topic456599-149-1.aspx

如果臨時表或表變量被頻繁使用的話,而不是丟棄它們,SQL只是「截斷」他們,留下的定義。它節省了在下次需要時重新創建表格的工作量。

+0

這是很棒的信息。 – 2009-10-22 13:56:47

+0

非常感謝 - 所以論壇後向我確認這些表是表varialbes的結果,並且優化程序決定保留它們,因爲它們經常被引用。我仍然希望擺脫它們以消除我的性能問題。 – 2009-10-22 14:01:00

+3

刪除一個表或讓它超出範圍並不會立即刪除它。你的批次知道你已經放棄了它,所以你不能再引用它,但它仍然存在。有一個處理實際丟棄過程的後臺進程。也許看看櫃檯「毀壞臨時表」,看看這是否真的是你的性能問題的來源。您可以在「監視和故障排除」部分(大量滾動)下找到有關此信息的詳細信息:http://msdn.microsoft.com/en-us/library/cc966545.aspx#EDAA – 2009-10-22 14:10:26

0

使用#前綴創建的表僅適用於當前連接。因此,您創建的任何新連接都將無法看到它們,因此無法刪除它們。

你怎麼知道他們仍然存在?你運行什麼命令來找出這個問題?

創建它們的連接是否正確關閉?如果不是,那麼這可能就是爲什麼它們仍然存在。

+0

感謝羅賓 - 但我是這個數據庫實例上的唯一用戶。創建它們的連接已斷開連接。 – 2009-10-22 13:54:33

+0

你能說明你如何看到這些表仍然存在嗎?這是使用sp_tables嗎? SELECT * FROM sysobjects? – 2009-10-22 14:01:44