AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 88774
Accepted
KASQLDBA
KASQLDBA
Asked: 2015-01-08 11:00:48 +0800 CST2015-01-08 11:00:48 +0800 CST 2015-01-08 11:00:48 +0800 CST

具有聚集索引的表消耗最大内存导致低 PLE 警报

  • 772

对于我的一台具有以下配置的服务器,我不断收到低 PLE 的警报,每天的范围在 20-400 和平均 90-100 之间:

服务器:SQL Server 2008R2

数据库:系统和 2 个用户数据库,数据库的最大大小为 54 GB

内存:16GB

最大服务器系统内存:12.24 GB

一旦我得到内存压力的提示,我就使用 RAMMAP 来查找内存使用情况,并发现使用 13.8 GB 的私有进程表明对较低内存压力的进一步怀疑:

根据 Paul Randal 的博客,我分析并发现其中一个用户数据库 A 使用了 8 GB RAM:此外,我分析了一段时间,发现 tempdb 平均使用 3-4 GB RAM

然后通过进一步调查,我发现在那个数据库 A 中有一个表有一个聚集索引,平均消耗 6-6.5 GB 的内存。(碎片不是问题,因为它已经过检查)

现在从这里我不确定如何进行?我应该去创建丢失的索引还是可以删除未使用的索引?或者在做出任何结论之前我还需要深入研究其他内容。

请建议!

sql-server-2008-r2 index-tuning
  • 1 1 个回答
  • 602 Views

1 个回答

  • Voted
  1. Best Answer
    Shanky
    2015-01-09T11:36:38+08:002015-01-09T11:36:38+08:00

    首先,图片中的 SQL ServerSQL Server 2008 R2 RTM不受 Microsoft 的任何支持,请应用SQL Server 2008 R2 SP3至少获得扩展支持

    我分析并发现其中一个用户数据库 A 使用了 8 GB RAM

    我不认为因此有任何问题,这是完全正常的看这个你不能得出任何结论。

    A 有一个具有聚簇索引的表平均消耗 6-6.5 GB 的内存

    我猜这张表是数据库中最大的表,它占用了缓冲池的大部分。我不能直接说为什么表再次持有如此多的内存you should first apply SP3 to rule out any possibility of leaks and then move with troubleshooting。

    对于我的一台具有以下配置的服务器,我不断收到低 PLE 的警报,每天的范围在 20-400 和平均 90-100 之间:

    对于具有 12 G RAM 的系统,PLE 应该在 900 左右。但是既然你说它总是在 300-400 左右,这让我觉得 SQL Server 必须努力工作并且由于内存压力而经常将页面从内存移出到磁盘。要确认内存压力,您必须依赖其他计数器而不仅仅是 PLE,您可以打开 perfmon 并添加以下计数器。最好创建一个数据收集器集来监视性能计数器

    1. SQLServer:memory Manager--Target Server Memory:这是 SQL Server 试图获取的内存量。

    2. SQLServer:memory Manager--Total Server memory 这是 SQL Server 已获取的当前内存。

      (理想情况下目标值应小于或等于总计)

    3. Page reads/sec – 每秒发出的物理数据库页面读取数。此统计信息显示所有数据库的物理页面读取总数。由于物理 I/O 非常昂贵,您可以通过使用更大的数据缓存、智能索引和更高效的查询,或者通过更改数据库设计来最大限度地降低成本

    4. Free Pages – 所有空闲列表中的页面总数(空闲列表跟踪缓冲池中当前未分配给数据页的所有页面,因此可立即使用)。毫无疑问,这个值应该很高

    5. 页面预期寿命——页面在没有引用的情况下保留在缓冲池中的秒数 > 如果您有 NUMA 系统分析每个节点的 PLE,如本文所述

    6. Free List Stalls/sec – 每秒必须等待空闲页面的请求数。理想情况下,档位应尽可能为零或尽可能少

    7. SQLServer:Memory Manager--Memory Grants Pending:如果您在缓冲池中看到内存授予挂起,则您的服务器正面临 SQL Server 内存紧缩,增加内存是个好主意。对于内存授予,请阅读这篇文章:如果您看到非零值的内存授予挂起且 PLE 低和空闲列表停顿高,您肯定有内存压力,应该考虑提供更多 RAM。

    请注意:上述计数器的值应至少收集 3-4 小时,并且在系统负载相对非常高时收集。如果可能的话,在收集值之前请刷新缓冲区缓存,虽然我不是说你要这样做,但我知道对于 Prod 系统这是不可能的。如果你能产生价值,我可以为你分析。

    我不知道系统的工作量,只是给你选择如何进行。您还应该分析代价高昂的查询。寻找一个涉及散列连接和排序的。

    一个在大表上进行大量连接和扫描的错误查询具有所有能力,可以使 PLE、内存授予、空闲列表停止等计数器值,这让你相信它的内存压力,是的,但原因是糟糕的查询和缺少索引和不正确的加入。你也应该考虑这一点。

    编辑:

    根据上述计数器的要求,来自性能数据收集器的输出

    在此处输入图像描述

    以下是一些值得注意的点

    1. 目标服务器内存和总服务器内存在there value were equal整个数据收集过程中(从上午 10 点到下午 3 点)保持不变。这表明 SQL Server 数据库引擎对其当前的内存需求感到满意

    2. 未决的内存授予是always zero。

    3. Free List stalls/Sec 为always zero. 这意味着没有请求必须等待空闲页面

    4. 从下午 2 点 15 分到下午 3 点 18 分,PLE 有相当大的减少,同时页面读取/秒非常高,这让我相信一些查询/进程在下午 2:00 之后开始,这需要太多的内存页面和因此导致缓冲池中出现一系列活动。

    您需要找出什么查询在下午 2:00 之后运行并且它仍在运行,所以这让我觉得 process.job 从下午 2:00 开始。此进程/作业/查询正在尝试读取太多页面,这导致 lazywriter 刷新太多页面,因为查询正在为此类页面请求空间

    可能是这样的查询缺少索引,可能是由于统计数据偏斜而创建了一个错误的计划,可能是需要编写查询来获取/读取数据的子集而不是整个数据。

    1. 说它是内存压力是不正确的,它只是那个特定的进程正在创建看起来像内存压力的场景。
    • 4

相关问题

  • SQL Server 2008 R2 中的自动收缩、加密和恢复模型属性

  • SQL Server 2008 R2 群集的无人参与安装失败并出现错误 - “路径中有非法字符”。

  • 迁移大型数据库

  • 代理执行的维护计划

  • 随机化表内容并将它们存储回表中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve