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 / 问题 / 253806
Accepted
RGO
RGO
Asked: 2019-11-21 21:18:28 +0800 CST2019-11-21 21:18:28 +0800 CST 2019-11-21 21:18:28 +0800 CST

我是否需要向我的 SQL Server 2008 R2 实例添加更多内存?

  • 772

有人问我,我们的 SQL Server 实例之一是否有足够的内存。这是在具有 40 个 CPU 和 64 GB RAM 的 x64 计算机上运行的 SQL Server 2008 R2 标准版。

此实例下运行的所有数据库的总大小略大于 300 GB。

该实例已配置为最小服务器内存为 4096 MB,最大服务器内存为 24000 MB。

到目前为止,我已经设法收集了以下信息:

正在使用的物理内存:

SELECT physical_memory_in_use_kb, 
   process_physical_memory_low, 
   process_virtual_memory_low
FROM sys.dm_os_process_memory 

physical_memory_in_use_kb process_physical_memory_low process_virtual_memory_low
------------------------- --------------------------- --------------------------
25657180                  0                           0

性能计数器:

SELECT counter_name , cntr_value 
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Total Server Memory (KB)', 
'Target Server Memory (KB)', 'Granted Workspace Memory (KB)',
'Maximum Workspace Memory (KB)',
'Memory Grants Outstanding', 'Memory Grants Pending')

 counter_name                                cntr_value
-----------------------------------     --------------------
  Granted Workspace Memory (KB)                1024
  Maximum Workspace Memory (KB)                17714520
  Memory Grants Outstanding                    1
  Memory Grants Pending                        0
  Target Server Memory (KB)                    24576000
  Total Server Memory (KB)                     24576000

缓冲池:

select count(*) AS Buffered_Page_Count
 ,count_big(*) * 8192 / (1024 * 1024) as Buffer_Pool_MB
from sys.dm_os_buffer_descriptors

Buffered_Page_Count Buffer_Pool_MB
------------------- --------------------
2499693             19528

缓冲池大小图:

在此处输入图像描述

BPHR:

在此处输入图像描述

请:

在此处输入图像描述

计划缓存大小:

在此处输入图像描述

每秒页面读取次数

在此处输入图像描述

每秒页面写入次数

在此处输入图像描述

总 IO 等待时间: 在此处输入图像描述

我的问题是:

我应该看的其他东西是什么?

如果以上就足够了,我是否必须建议添加更多内存(可能是 50 GB),因为 PLE 会随着时间的推移而下降(而总 IO 等待时间显示会增加)?

目标服务器内存等于最大内存集。如果配置了实例,这是否表明实例可以利用更多内存?

那么,我如何知道我的 SQL Server 是否需要更多内存?或者它没有

sql-server sql-server-2008-r2
  • 1 1 个回答
  • 130 Views

1 个回答

  • Voted
  1. Best Answer
    Randi Vertongen
    2019-11-22T01:22:59+08:002019-11-22T01:22:59+08:00

    我应该看的其他东西是什么?

    前几句

    这是在具有 40 个 CPU 和 64 GB RAM 的 x64 计算机上运行的 SQL Server 2008 R2 标准版。

    为什么你的最大记忆只有在24000MB你有64GB物理记忆的时候?是否有其他实例/服务/...在其上运行?

    如果答案是否定的,那么您可以将 max memory 设置为 about 56GB = 57344 MB。

    附带说明一下,sql server 2008 R2 没有扩展支持。最好考虑迁移到更新的版本。

    哪些对象正在消耗缓冲池内存

    由于您的 PLE 一直很低,并且随着时间的推移变得更低,您可以查看在一天中的不同时间点究竟是什么在使用此 BP 内存。

    首先看看哪些数据库消耗最多:

    -- get memory usage per database
    SELECT
    [DatabaseName] = CASE [database_id] WHEN 32767
    THEN 'Resource DB'
    ELSE DB_NAME([database_id]) END,
    COUNT_BIG(*) [Pages in Buffer],
    COUNT_BIG(*)/128 [Buffer Size in MB]
    FROM sys.dm_os_buffer_descriptors
    GROUP BY [database_id]
    ORDER BY [Pages in Buffer] DESC;
    

    之后,您可以在数据库级别更深入地了解哪些对象在内存中,以及这些对象在内存中拥有多少页。

    -- get memory usage for objects in a database
    
    select
           count(*)as cached_pages_count,
           obj.name as objectname,
           ind.name as indexname,
           obj.index_id as indexid
    from sys.dm_os_buffer_descriptors as bd
        inner join
        (
            select       object_id as objectid,
                               object_name(object_id) as name,
                               index_id,allocation_unit_id
            from sys.allocation_units as au
                inner join sys.partitions as p
                    on au.container_id = p.hobt_id
                        and (au.type = 1 or au.type = 3)
            union all
            select       object_id as objectid,
                               object_name(object_id) as name,
                               index_id,allocation_unit_id
            from sys.allocation_units as au
                inner join sys.partitions as p
                    on au.container_id = p.partition_id
                        and au.type = 2
        ) as obj
            on bd.allocation_unit_id = obj.allocation_unit_id
    left outer join sys.indexes ind 
      on  obj.objectid = ind.object_id
     and  obj.index_id = ind.index_id
    where bd.database_id = db_id()
      and bd.page_type in ('data_page', 'index_page')
    group by obj.name, ind.name, obj.index_id
    order by cached_pages_count desc;
    

    如果更精细的查询报告更少,则必须删除and bd.page_type in ('data_page', 'index_page')以包含 LOB 数据页。

    下一步

    您应该将此信息与系统上运行的查询放在一起,您可能能够优化某些查询/添加索引,从而减少内存中需要的数据。

    如果你想走得更远,ROW / PAGE如果你有 CPU 能力,可以考虑压缩。

    压缩数据在内存中保持压缩状态。

    另请注意,如果您使用的是 sql server 2008 R2 标准版,则只能转到64GBmax memory。从 sql server 2014 开始,这会达到128GB最大内存。这也是迁移的另一个原因。


    如果以上就足够了,我是否必须建议添加更多内存(可能是 50 GB),因为 PLE 会随着时间的推移而下降(而总 IO 等待时间显示会增加)?

    仅基于 PLE,这不是唯一需要考虑的因素,我会说您的页面过于频繁地被刷新到内存之外。优化您的查询或增加您的内存。

    目标服务器内存等于最大内存集。如果配置了实例,这是否表明实例可以利用更多内存?

    目标服务器内存 (KB) 是 SQL Server 在其当前负载下愿意(可能)分配给缓冲池的内存量。Total Server Memory (KB) 是 SQL 当前已分配的内存。

    资源

    它已将所有可能的内存分配给最大内存允许的缓冲池,它不会超过这个数量的缓冲池分配。

    那么,我如何知道我的 SQL Server 是否需要更多内存?或者它没有

    同样,查看内存中的对象以及负责它的查询是否可以优化将是一个好的开始。

    此外,如果您有空间,我会增加最大内存(如果您实际上在机器上有 64GB 内存)或增加机器上的内存。

    再次记住,64GBsql server 2008 R2 标准版有最大内存限制,并且128GB从 sql server 2014 标准版开始增加。

    企业版没有限制。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

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