Sql Server缓冲池、连接池等基本知识详解

 更新时间:2024年09月04日 10:21:14   作者:码农研究僧  
这篇文章主要介绍了Sql Server缓冲池、连接池等基本知识,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

缓存池

缓存机制是指将经常访问的数据或查询结果保存在内存中,以提高查询性能和整体系统响应速度

缓冲池 (Buffer Pool):

  • SQL Server 中最大的一块内存区域,用于存储从磁盘读取的页,以减少对磁盘的直接访问
  • 缓冲池中的页包括数据页、索引页、系统表页等

计划缓存 (Plan Cache):

  • 将执行过的查询计划缓存在计划缓存中,以便重复使用,减少查询解析和优化的开销
  • 查询计划是查询优化器生成的执行查询的步骤

数据缓存 (Data Cache):

  • 数据缓存是缓冲池的一部分,专门用于缓存数据页
  • 当查询访问表中的数据时,SQL Server 会首先检查数据缓存,如果数据已经在缓存中,则直接返回,否则从磁盘读取并缓存

一、查看缓存使用情况

-- 查看缓冲池使用情况
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;

-- 清除数据缓存
CHECKPOINT;
DBCC DROPCLEANBUFFERS;

三、监控缓存命中率

-- 缓冲池命中率
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');

截图如下:

连接池

一、查看当前活动的连接数

SELECT 
    DB_NAME(dbid) AS DatabaseName,
    COUNT(dbid) AS NumberOfConnections
FROM sys.sysprocesses
WHERE dbid > 0
GROUP BY dbid;

截图如下:

二、查看当前连接的具体信息

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;

截图如下:

五、查看用户连接数

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不行,反而重启服务器才可以,考虑是否应用有死锁,导致应用在争夺资源

如果连接池信息满了,考虑如下方式重置资源池

ALTER RESOURCE POOL pool_name
WITH (
    MIN_MEMORY_PERCENT = 0,
    MAX_MEMORY_PERCENT = 100
);

重置资源配置调度:

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;

如果当前资源池的内存限制太低,可以增加这两个参数:

ALTER RESOURCE POOL pool_name
WITH (
    MIN_MEMORY_PERCENT = new_min_memory_percent,
    MAX_MEMORY_PERCENT = new_max_memory_percent
);
ALTER RESOURCE GOVERNOR RECONFIGURE;

还可分配更多的资源给高优先级的任务:(调整工作负载组的配置,以确保高优先级任务获得更多资源)

ALTER WORKLOAD GROUP group_name
USING pool_name;
ALTER RESOURCE GOVERNOR RECONFIGURE;

最终还需监控和优化

  • 监控资源使用情况:定期监控资源池的资源使用情况,确保配置合理
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;
  • 优化查询和索引:优化查询和索引,减少资源消耗
  • 定期维护和清理:定期维护数据库,清理不必要的数据和索引,释放资源

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE

    SQLServer中汇总功能的使用GROUPING,ROLLUP和CUBE

    查看SQL Server的帮助才发现,厉害啊,原来还有这么厉害的东西,不由的想起以前做水晶报表的时候,原来在SQL Server中就可以实现这样的功能.
    2010-07-07
  • 合并SQL脚本文件的方法分享

    合并SQL脚本文件的方法分享

    在平时的工作中,我会经常的碰到这样需要合并SQL脚本的问题。如,有很多的SQL脚本文件,需要按照一定的先后顺序,再生成一个合并SQL脚本文件,然后再发布到用户SQL Server服务器上。
    2011-09-09
  • jdbc使用PreparedStatement批量插入数据的方法

    jdbc使用PreparedStatement批量插入数据的方法

    这篇文章主要介绍了jdbc使用PreparedStatement批量插入数据的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • CREATE FUNCTION sqlserver用户定义函数

    CREATE FUNCTION sqlserver用户定义函数

    创建用户定义函数,它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样,用户定义函数可以从查询中唤醒调用。也可以像存储过程一样,通过 EXECUTE 语句执行
    2012-07-07
  • sql server定时作业调用Kettle job出错的快速解决方法

    sql server定时作业调用Kettle job出错的快速解决方法

    这篇文章主要介绍了sql server定时作业调用Kettle job出错的快速解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • SQL SERVER数据库收缩日志的实现步骤

    SQL SERVER数据库收缩日志的实现步骤

    这篇文章主要介绍了SQL SERVER数据库收缩日志的实现步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2024-04-04
  • sqlserver中获取月份的天数的方法分享

    sqlserver中获取月份的天数的方法分享

    今天查看以前专案的数据库自定义函数,温习温习。发现其中有一个函数,是获取月份的天数的自定义函数。
    2011-09-09
  • SQL Server里书签查找的性能伤害

    SQL Server里书签查找的性能伤害

    本文主要介绍了SQL Server里书签查找的性能伤害,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 文本、Excel、Access数据导入SQL Server2000的方法

    文本、Excel、Access数据导入SQL Server2000的方法

    昨天参加一个项目的维护,因为各种原因,数据在不同服务器上不一致,所以需要重新将数据库清空一次,并将整理后的数据重新导入。需导入的数据源为文本文件,记录以行存储,“,”逗号分割各字段,每个字段值用“”双引号封闭。
    2008-10-10
  • sql调优的几种方式小结

    sql调优的几种方式小结

    本文主要介绍了sql调优的几种方式小结,包含了15种调优方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06

最新评论