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 / 问题 / 244845
Accepted
Aleksey Vitsko
Aleksey Vitsko
Asked: 2019-08-09 01:13:37 +0800 CST2019-08-09 01:13:37 +0800 CST 2019-08-09 01:13:37 +0800 CST

缓冲池的数据库页中有大量 <free_space_in_bytes>

  • 772

我们正在sys.dm_os_buffer_descriptors使用以下查询查看

select 
 d.[name]                                       [Database_Name],
 (count(file_id) * 8) / 1024                    [Buffer_Pool_Size_MB],
 sum(cast(free_space_in_bytes as bigint)) / 1024 / 1024     [Free_Space_MB]
from sys.dm_os_buffer_descriptors b
    join sys.databases d on
        b.database_id = d.database_id
group by d.[name]
order by [Buffer_Pool_Size_MB]

对于我的一个数据库,它显示 [Buffer_Pool_Size_MB] = 77325 MB,并且 [Free_Space_MB] = 15849 MB

因此,缓冲池中大约 20% 的页面空间是空的。好像很浪费资源

问题:

  • 这是一个问题吗?
  • 如何free_space_in_bytes减少数量?
  • 在我们的情况下还有其他需要调查/查看的事情吗?
sql-server-2017 buffer-pool
  • 1 1 个回答
  • 143 Views

1 个回答

  • Voted
  1. Best Answer
    Erik Darling
    2019-08-09T02:39:54+08:002019-08-09T02:39:54+08:00

    这是一个问题吗?

    也许,也许不是。如果您的数据库仅占服务器最大服务器内存的 80%,那么这就是我期望看到的。

    如果您的数据多于 RAM,则可用空间可能是由于其他要求内存的东西。其他可能是查询、CHECKDB、索引重建等的内存授予。

    它也可能代表 Windows 和 SQL Server 之间的内存争斗。当您没有设置最大服务器内存来为 Windows 提供 10% 的内存十分之一以便它可以正常运行时,通常会发生这种情况。

    之后,其他东西占用了内存,它要么没有被缓冲池重新使用,要么各种其他东西继续使用可以被缓冲池使用的内存。

    如何减少 free_space_in_bytes 的数量?

    如果您的数据库占最大服务器内存的约 80%,则什么也没有。

    如果他们不这样做,您可以:

    • 添加内存
    • 尝试让其他东西要求更少的内存

    添加内存 通常会有所帮助,如果您添加足够的内存以缓存最常查询的对象并为需要它们的进程提供内存授权。弄清楚这个数字是留给你的练习。没有通用的计算,但一个好的起点是 RAM 占服务器数据的 50%。简单来说:如果你有 10GB 的数据,就有 5GB 的 RAM。

    让其他东西要求更少的内存归结为弄清楚还有什么东西在要求内存,并适当地调整这些东西。

    在我们的情况下还有其他需要调查/查看的事情吗?

    是的!查看被盗页面计数器:

    SELECT *
    FROM sys.dm_os_performance_counters AS dopc
    WHERE dopc.counter_name LIKE 'Stolen Server Memory%';
    

    这可以告诉您 SQL Server 从缓冲池中获取了多少内存并分配给了其他东西。

    您还可以查看 SQL Server 是否必须强制任何查询内存授予:

    SELECT *
    FROM sys.dm_exec_query_resource_semaphores AS deqrs
    WHERE deqrs.forced_grant_count > 0;
    

    由于您使用的是 SQL Server 2017,因此可以使用sp_BlitzCache:

    EXEC sp_BlitzCache @SortOrder = 'memory grant';

    这将向您显示要求最大内存授予的查询。当然,如果您的服务器内存非常低,您的计划缓存数据可能会很糟糕,因为那里的周转率可能非常高。如果是这种情况,请在此处停止并添加内存,然后再继续。

    如果已打开,您可以尝试使用 Query Store。Proc 可从与上述相同的链接获得。

    EXEC sp_BlitzQueryStore @DatabaseName = 'Your Important Database';

    然后在结果中寻找“内存授予”模式。对于那些带回的查询,请在计划中查找排序和哈希。这些通常代表索引或查询调整机会。如果您需要帮助调整这些问题,请随时将它们作为新问题发布。不要把它们粘在这个上面。

    而且,当然,也可能是您从不使用该内存。不过,我不会管它,因为有一天你可能会增长到那 20%。

    • 2

相关问题

  • 我无法访问任何数据库图

  • 无法在 Ubuntu 16.04 上启动 SQL Server

  • 在 Sql Server 中,VAS 和缓冲池有什么区别?

  • 为什么数据库使用缓冲池进行写操作?[关闭]

  • DB2 - 如何估计适当的 BUFFERPOOL 大小?

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