SQLServer数据页缓冲区内存瓶颈分析

SQL Server将缓存内存中经常使用的数据(数据页缓存)以提高数据访问速度,因为磁盘访问远远低于内存,减少磁盘访问也是数据库优化的一个重要方面。

当数据页缓存中缺少内存时,会出现诸如查询慢、磁盘繁忙等问题。

分析方法:性能计数器的主要用途。

查看下面的性能计数器:

1。SQL Server:缓冲区管理器懒惰写/秒:内存不足会频繁地调用延迟写入器将多个数据写入磁盘,这个值通常不会为0。

2。SQL Server:缓冲管理器页面预期寿命:当内存不足时,此计数器作为下降趋势或保持在较低的值。

当3。SQL Server:缓冲区管理器页读/秒:内存不足,在查询经常使用但不缓存在内存中的数据时,不需要读取磁盘。此值是连续上升或停留在较高的值。

4。SQL Server:缓冲区管理器被盗页面:通常用于缓存执行计划以供重用。当内存不足时,SQLServer本身优先清除执行计划缓存,而这个值被减少或降低。

查询当前用户任务等待:

复制代码代码如下所示:
SELECT * FROM sys.sysprocesses

如果记忆是不够的,你会看到更多的async_io_completion等类型。这是由于内存不足:A.将互动频繁的内存和磁盘之间,和磁盘负载的增加而增加。b.需要读取磁盘上的数据,完成查询并增加磁盘负载。

也就是说,此时的性能瓶颈也出现了,但这只是表面的。我们应该结合多个性能指标,看看根本原因是内存不足。

确定压力源和解决方案:

通过前面的分析,确定了与数据页面缓存相关的内存瓶颈,分析了原因和解决方案,分为以下5个方面:

1。外部压力

如果操作系统级别或其他应用程序服务需要更多内存,Windows将压缩数据库页面中的内存量。此时内存压力来自外部:

1。SQL Server:内存管理器总服务器内存:此计数器值将下降。

2。内存:可用物理:这个值将下降到一个较低的水平。

3、不使用敬畏或锁定内存页面,过程:私有字节SQLServer和过程:工作集,SQLServer将大幅减少。

解决方案:如果不是DB专用服务器,就必须平衡每个应用程序服务分配内存或增加内存的重要性。尽量让服务器只运行SQL Server,并成为DB专用服务器。

2。SQL Server自身对Database Page的压力

当总服务器内存最大服务器内存达到或从OS获取更多内存时,经常访问的数据要比物理缓存容量大得多,因此SQLServer被迫移动内存数据,以完成当前查询。

观察下列性能计数器:

1的值。SQL Server:内存管理器总服务器内存和SQL Server:内存管理器目标服务器内存将相等,但前者不会大于后者。

2。分析方法中将描述一种情况。

解决方案:由于SQL Server没有足够的内存来存储Database Page,它可以增加SQLServer所使用的内存量或减少其内存使用量。

增加:您可以添加物理内存,敬畏和其他方法。

减少:通过横向扩展,有两个或多个服务器池设置;优化读取大量语句。

3内存压力被盗。缓冲池

在正常情况下,缓冲池中被盗的内存不会对数据库页面造成压力。因为数据库页面有压力,所以它会触发延迟写入,而SQLServer则会清除被盗内存中的执行计划缓存。

但是,如果用户声明太多对象,并且不登出并占用过多内存,它们将压缩数据库页面,如游标、自定义引用执行计划等。

该解决方案通常表示为:)由于缺少内存,用户提交的请求无法完成。701个错误;b)需要压缩某个职员的内存容量,以完成用户请求,从而导致响应延迟和延迟。

通过查询sys.dm_os_memory_clerks现场single_pages_kb,找出哪些职员使用太多内存,并分析原因,然后解决它。

4。多页的压力

多页的股票操作系统缓冲池的虚拟地址空间,如果多个网页使用了太多的内存,这将压缩数据库页多页的内存量一般较小,相对固定,这可能会发生:

32位SQL Server不打开敬畏只有2G的地址空间和MemToLeave,扩展与G参数的上限值。

B 64位SQL Server已经切换了内存泄漏的第三方代码。

C.在语句中使用了大量参数或更长的参数。

D.增加网络数据包大小,大于或等于8KB,更多这样的连接。

e是大量复杂的XML查询,或第三个代码。

解决方案:通过查询sys.dm_os_memory_clerks现场multi_pages_kb,找出哪些职员使用太多内存,并分析原因,然后解决它。


作者:joe.tj