SQL Server 应该有多少内存

whd*_*whd 5 performance sql-server memory page-life-expectancy

我有一个占用 500gb 的数据库,我注意到即使我有 100gb 的 RAM,我的 ple 也很低。我在谷歌中搜索过原因,我发现了一些有趣的查询。我有一个在非常大的表上运行的查询,即使它使用聚集索引,它也会导致 ple 删除。我在查询前后以及查询完成后检查了缓冲池中的内容,看起来 DB 必须为我的查询中使用的索引释放一些空间,并且在查询旧索引加载到缓冲池之后。我的问题是 DB 应该有多少 RAM 内存,我如何计算它,它是否应该是让我一次将所有使用的索引保存在内存中的数量?或者我应该减少保存在表中的数据,以便索引会更小?

spa*_*dba 7

每次扫描大索引(或大表,如果您愿意)时,都必须将数据从磁盘带到内存。发生这种情况时,如果缓冲池正在保存来自其他对象的数据并且没有足够的可用空间来容纳您从磁盘读取的页面,则必须丢弃某些内容。

低 PLE 意味着此过程发生得太频繁,从而使您的缓冲池崩溃并使您的 I/O 子系统不堪重负。

一些改进方法:

  1. 添加更多内存。现在很容易而且不是很贵。并不能真正解决问题,但可以是一个可接受的短期解决方案。多少内存?足以容纳数据库的活动部分。只有你能说出那是多少。并非所有版本的SQL ServerWindows都可以使用相同数量的 RAM,因此请确保您不受此限制。
  2. 清除一些数据。您确定需要那里的所有数据吗?
  3. 创建较小的索引。这意味着在您的索引中包含涵盖您的查询的最少列集。大扫描在较小的索引上工作得更快,需要的 RAM 更少。权衡是在磁盘上使用更多空间和更新表时要执行的更多操作。
  4. 创建过滤索引。如果您经常根据常见的非选择性条件(例如:active=true或类似的条件)进行过滤,则过滤索引可能有助于减小索引的大小。这对应用程序也有一些影响(一些 SET 选项限制使其工作)。
  5. 使用压缩。数据在磁盘和内存中都被压缩,因此 ROW/PAGE压缩可以成为减少内存消耗的一种方式。您将需要企业版,并且必须放弃一些 CPU,但对于大型对象而言,这通常是值得的。
  6. 使用正确的数据类型:使用(n)charover(n)varcharintwhentinyint就足够了,不仅会浪费磁盘空间,还会浪费缓冲池空间。这包括字符和数字数据类型:确保为数据列使用正确的类型/大小/精度/比例。