在SQL Server中,會話的狀態有運行(Running)、睡眠(Sleeping)、休眠(Dormant)、Preconnect 等狀態,有時候你會在數據庫中看到不少會話處於睡眠(Sleeping)狀態,那麼這些睡眠(Sleeping)狀態的會話會消耗CPU、Memory資源嗎?若是消耗資源的話,那麼sleeping會話具體消耗多少內存資源呢? 另外它會影響數據庫性能嗎?sql
首先,處於睡眠(Sleeping)狀態的會話意味着當前沒有運行任何請求。這樣也意味着這種狀態的會話是不會消耗CPU資源的,那麼它是否消耗內存資源呢?答案是會,它會保留了必定數量的內存,用於保存與會話相關的結構。 這包括會話上下文等信息, 關於每一個處於睡眠狀態會話消耗的內存具體大小,可使用下面腳本查看睡眠(Sleeping)狀態會話消耗的內存(不肯定其值的準確性,文末有介紹):數據庫
SELECT
s.session_id
, s.status
, s.last_request_start_time
, s.memory_usage*8 AS memory_usage_kb
, t.task_state
, s.host_name
, s.program_name
, s.transaction_isolation_level
--, s.open_transaction_count
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s ON
s.session_id = c.session_id
LEFT JOIN sys.dm_os_tasks AS t ON
t.session_id = s.session_id
WHERE s.status='sleeping'
ORDER BY
s.memory_usage DESC;
使用這個這個腳本查出,發現處於睡眠(Sleeping)狀態會話消耗的內存有不少狀況: 0KB、16KB、24KB、32KB、40KB、.....216KB. 彷佛沒有什麼規律,固然以32KB、40KB居多。官方文檔關於這方面的介紹幾乎沒有,僅僅在「Memory Used by SQL Server Objects Specifications」中有部分介紹,以下所示:網絡
下表列出 SQL Server 中不一樣對象所用內存的大體數值。列出的數值爲估計值,具體取決於環境和建立對象的方式。SQL Server 2005 管理某些項的方式與早期版本存在顯著差別。session
|
SQL Server 2000app |
SQL Server 2005sqlserver |
SQL Server 2008性能 |
鎖測試 |
每一個全部者 64 字節 + 32 字節this |
每一個全部者 64 字節 + 32 字節spa |
每一個全部者 64 字節 + 32 字節 |
打開的數據庫 |
每一個文件 3924 字節 + 1640 字節,每一個文件組 336 字節 |
不適用於 SQL Server 2005 |
不適用於 SQL Server 2008 |
打開的對象 |
對象中每一個打開的索引 256 字節 + 1724 字節 |
不適用於 SQL Server 2005 |
不適用於 SQL Server 2008 |
用戶鏈接 |
12 KB + (3 * network_packet_size) |
約爲 (3 * network_packet_size + 94 KB) |
約爲 (3 * network_packet_size + 94 KB) |
網絡數據包大小是表格格式數據流 (TDS) 數據包的大小,該數據包用於應用程序和 SQL Server 數據庫引擎之間的通訊。默認的數據包大小爲 4 KB,由「網絡數據包大小」配置選項控制。
啓用多個活動的結果集時,用戶鏈接約爲 (3 + 3 * num_logical_connections) * network_packet_size + 94 KB。
可是在SQL Server 2008以後的文檔,沒有看到這方面內容的介紹。在SQL Server 200五、SQL Server 2008數據庫中測試發現(使用最上面的腳本)memory_usage大小爲16KB、24KB,遠小於94KB,這個文檔和測試結果也一度讓我懷疑sys.dm_exec_sessions這個DMV視圖中memory_usage字段計算Sleeping會話消耗內存的準確性。很遺憾,官方資料關於memory_usage的介紹僅爲:Number of 8-KB pages of memory used by this session. Is not nullable. 不過,有點能夠確認的是:Sleeping狀態的會話消耗的內存資源真的不多。基本上對數據庫性能影響很小。
參考資料:
https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/aa337559(v=sql.105)
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/62d19c9e-7ccb-4e1b-a18f-f249c23f0376/sleeping-spids-consume-cpu-and-memory-?forum=sqlgetstarted