Sql-Server

何時釋放 tempdb 分配?

  • May 18, 2021

在 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 磁碟的方法,如果這值得關注的話。

引用自:https://dba.stackexchange.com/questions/291776