Sql-Server
何時釋放 tempdb 分配?
在 Service Broker 隊列中,當一條消息隨著時間的推移繼續進行時,我們正在執行一個儲存過程,該過程正在使用臨時表執行一些繁重的操作。
我猜這
sp_WhoIsActive
是顯示 tempdb 分配和 CPU 使用率的匯總值,因為隊列正在使用一個會話。問題是,目前儲存過程完成時是否釋放分配?
請參閱 Microsoft BOL for Temporary Tables:
臨時表超出範圍時會自動刪除,除非使用 DROP TABLE 顯式刪除:
當儲存過程完成時,會自動刪除在儲存過程中創建的本地臨時表。該表可以被創建該表的儲存過程執行的任何嵌套儲存過程引用。呼叫創建該表的儲存過程的程序不能引用該表。
所有其他本地臨時表在目前會話結束時自動刪除。
當創建表的會話結束並且所有其他任務都停止引用它們時,將自動刪除全域臨時表。任務和表之間的關聯僅在單個 Transact-SQL 語句的生命週期內維護。這意味著在創建會話結束時主動引用該表的最後一個 Transact-SQL 語句完成時將刪除全域臨時表。
刪除TempTable後,它佔用的空間(以及依賴於它的任何資源)將被釋放(內部)。如果TempTable導致您的TempDB數據文件在磁碟上增長,即使在 SQL Server 內部釋放了空間,它也不會在作業系統中釋放回磁碟(就像任何其他數據庫的數據文件一樣)。SQL Server 將在內部將其重新用於其他TempDB操作。
重新啟動 SQL Server 或執行
SHRINK
命令是將內部未使用的空間釋放回 OS 磁碟的方法,如果這值得關注的話。