Sql Server緩沖池、連接池等基本知識詳解
緩存池
緩存機制是指將經(jīng)常訪問的數(shù)據(jù)或查詢結(jié)果保存在內(nèi)存中,以提高查詢性能和整體系統(tǒng)響應(yīng)速度
緩沖池 (Buffer Pool):
- SQL Server 中最大的一塊內(nèi)存區(qū)域,用于存儲從磁盤讀取的頁,以減少對磁盤的直接訪問
- 緩沖池中的頁包括數(shù)據(jù)頁、索引頁、系統(tǒng)表頁等
計劃緩存 (Plan Cache):
- 將執(zhí)行過的查詢計劃緩存在計劃緩存中,以便重復(fù)使用,減少查詢解析和優(yōu)化的開銷
- 查詢計劃是查詢優(yōu)化器生成的執(zhí)行查詢的步驟
數(shù)據(jù)緩存 (Data Cache):
- 數(shù)據(jù)緩存是緩沖池的一部分,專門用于緩存數(shù)據(jù)頁
- 當(dāng)查詢訪問表中的數(shù)據(jù)時,SQL Server 會首先檢查數(shù)據(jù)緩存,如果數(shù)據(jù)已經(jīng)在緩存中,則直接返回,否則從磁盤讀取并緩存
一、查看緩存使用情況
-- 查看緩沖池使用情況 DBCC DROPCLEANBUFFERS; -- 清除緩沖池 SELECT COUNT(*) AS cached_pages_count, (COUNT(*) * 8.0) / 1024 AS cached_pages_in_MB FROM sys.dm_os_buffer_descriptors WHERE database_id = DB_ID('YourDatabaseName'); -- 查看計劃緩存使用情況 SELECT cp.objtype AS [CacheType], OBJECT_NAME(st.objectid, st.dbid) AS [ObjectName], cp.usecounts AS [ExecutionCount], st.text AS [QueryText], cp.size_in_bytes / 1024 AS [SizeInKB] FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st WHERE cp.cacheobjtype = 'Compiled Plan' ORDER BY cp.usecounts DESC;
截圖如下:
二、清理緩存
-- 清除緩沖池 DBCC DROPCLEANBUFFERS; -- 清除計劃緩存 DBCC FREEPROCCACHE; -- 清除數(shù)據(jù)緩存 CHECKPOINT; DBCC DROPCLEANBUFFERS;
三、監(jiān)控緩存命中率
-- 緩沖池命中率 SELECT object_name, counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN ('Buffer cache hit ratio', 'Buffer cache hit ratio base');
截圖如下:
連接池
一、查看當(dāng)前活動的連接數(shù)
SELECT DB_NAME(dbid) AS DatabaseName, COUNT(dbid) AS NumberOfConnections FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid;
截圖如下:
二、查看當(dāng)前連接的具體信息
SELECT spid, ecid, status, loginame, hostname, db_name(dbid) AS DatabaseName, cmd, request_id FROM sys.sysprocesses;
截圖如下:
三、查看連接池信息
SELECT pool_id, min_memory_percent, max_memory_percent, used_memory_kb, target_memory_kb, max_memory_kb FROM sys.dm_resource_governor_resource_pools;
截圖如下:
四、查看每個連接的詳細信息
SELECT session_id, login_time, host_name, program_name, client_interface_name, login_name, status, cpu_time, memory_usage, logical_reads, writes, reads FROM sys.dm_exec_sessions;
截圖如下:
五、查看用戶連接數(shù)
SELECT login_name, Count(0) user_count FROM Sys.dm_exec_requests dr WITH(nolock) RIGHT OUTER JOIN Sys.dm_exec_sessions ds WITH(nolock) ON dr.session_id = ds.session_id RIGHT OUTER JOIN Sys.dm_exec_connections dc WITH(nolock) ON ds.session_id = dc.session_id WHERE ds.session_id > 50 GROUP BY login_name ORDER BY user_count DESC
截圖如下:
彩蛋
重啟Mysql不行,反而重啟服務(wù)器才可以,考慮是否應(yīng)用有死鎖,導(dǎo)致應(yīng)用在爭奪資源
如果連接池信息滿了,考慮如下方式重置資源池
ALTER RESOURCE POOL pool_name WITH ( MIN_MEMORY_PERCENT = 0, MAX_MEMORY_PERCENT = 100 );
重置資源配置調(diào)度:
ALTER RESOURCE GOVERNOR RECONFIGURE;
通過KILL的方式來清空連接:
DECLARE @session_id INT; DECLARE session_cursor CURSOR FOR SELECT session_id FROM sys.dm_exec_sessions WHERE session_id != @@SPID AND is_user_process = 1; OPEN session_cursor; FETCH NEXT FROM session_cursor INTO @session_id; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('KILL ' + @session_id); FETCH NEXT FROM session_cursor INTO @session_id; END CLOSE session_cursor; DEALLOCATE session_cursor;
如果當(dāng)前資源池的內(nèi)存限制太低,可以增加這兩個參數(shù):
ALTER RESOURCE POOL pool_name WITH ( MIN_MEMORY_PERCENT = new_min_memory_percent, MAX_MEMORY_PERCENT = new_max_memory_percent ); ALTER RESOURCE GOVERNOR RECONFIGURE;
還可分配更多的資源給高優(yōu)先級的任務(wù):(調(diào)整工作負載組的配置,以確保高優(yōu)先級任務(wù)獲得更多資源)
ALTER WORKLOAD GROUP group_name USING pool_name; ALTER RESOURCE GOVERNOR RECONFIGURE;
最終還需監(jiān)控和優(yōu)化
- 監(jiān)控資源使用情況:定期監(jiān)控資源池的資源使用情況,確保配置合理
SELECT pool_id, min_memory_percent, max_memory_percent, used_memory_kb, target_memory_kb, max_memory_kb FROM sys.dm_resource_governor_resource_pools;
- 優(yōu)化查詢和索引:優(yōu)化查詢和索引,減少資源消耗
- 定期維護和清理:定期維護數(shù)據(jù)庫,清理不必要的數(shù)據(jù)和索引,釋放資源
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SQLServer中匯總功能的使用GROUPING,ROLLUP和CUBE
查看SQL Server的幫助才發(fā)現(xiàn),厲害啊,原來還有這么厲害的東西,不由的想起以前做水晶報表的時候,原來在SQL Server中就可以實現(xiàn)這樣的功能.2010-07-07jdbc使用PreparedStatement批量插入數(shù)據(jù)的方法
這篇文章主要介紹了jdbc使用PreparedStatement批量插入數(shù)據(jù)的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04CREATE FUNCTION sqlserver用戶定義函數(shù)
創(chuàng)建用戶定義函數(shù),它是返回值的已保存的 Transact-SQL 例程。用戶定義函數(shù)不能用于執(zhí)行一組修改全局數(shù)據(jù)庫狀態(tài)的操作。與系統(tǒng)函數(shù)一樣,用戶定義函數(shù)可以從查詢中喚醒調(diào)用。也可以像存儲過程一樣,通過 EXECUTE 語句執(zhí)行2012-07-07sql server定時作業(yè)調(diào)用Kettle job出錯的快速解決方法
這篇文章主要介紹了sql server定時作業(yè)調(diào)用Kettle job出錯的快速解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2016-11-11SQL SERVER數(shù)據(jù)庫收縮日志的實現(xiàn)步驟
這篇文章主要介紹了SQL SERVER數(shù)據(jù)庫收縮日志的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2024-04-04文本、Excel、Access數(shù)據(jù)導(dǎo)入SQL Server2000的方法
昨天參加一個項目的維護,因為各種原因,數(shù)據(jù)在不同服務(wù)器上不一致,所以需要重新將數(shù)據(jù)庫清空一次,并將整理后的數(shù)據(jù)重新導(dǎo)入。需導(dǎo)入的數(shù)據(jù)源為文本文件,記錄以行存儲,“,”逗號分割各字段,每個字段值用“”雙引號封閉。2008-10-10