2012-03-15 23 views
6

我們正在努力優化我們的一些T-SQL存儲過程來減少tempdb的爭奪,但我想不出不表變量是如何通過SQL Server存儲:當在T-SQL存儲過程中聲明一個變量時,它是保存在內存還是tempdb中?

  • 什麼簡單數據類型像INT和DATETIME?感覺他們會生活在記憶中。
  • 什麼是VARCHARs/VARCHAR(MAX)?一個普通的VARCHAR可以駐留在內存中,但一個VARCHAR(MAX)可能需要使用tempdb來存儲它。
  • 表變量存儲在tempdb中。這些我雖然不是真的感興趣。

MSDN article on tempdb沒有解釋常規變量。

回答

8

The Capacity Planning article for tempdb回答您的問題:

大對象數據類型爲varchar(max),爲nvarchar(最大), VARBINARY(最大值)的text,ntext,圖像和XML。這些類型的尺寸最多可達2 GB,並可用作過程,用戶定義函數,批處理或查詢的變量或參數。如果值很小,則參數 和定義爲LOB數據類型的變量將使用主存儲器作爲 存儲。但是,較大的值存儲在tempdb的 中。當LOB變量和參數存儲在tempdb中時,它們將被視爲內部對象。您可以查詢 sys.dm_db_session_space_usage動態管理視圖,以報告分配給給定會話的內部對象的 頁面。

這篇文章值得一讀,因爲它也涵蓋了很多tempdb的其他用途。

編輯:如果您感到好奇特定的會話了多少內存在tempdb中使用,可以運行下面的查詢:

select * 
from sys.dm_db_session_space_usage 
where session_id = @@SPID 

利用這一點,它看起來並不像我VARCHAR(MAX)變量保存在tempdb中,直到達到大約1000 KB的大小......但是我確定這取決於您的服務器可用的內存。

+0

感謝您的發現!我假設「如果值很小」意味着少於8000字節?無論如何,這篇文章似乎暗示非MAX(N)VARCHAR和小變量都存儲在內存中。 – 2012-03-15 22:19:11

相關問題