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 / 问题 / 313658
Accepted
John Eisbrener
John Eisbrener
Asked: 2022-06-23 08:58:55 +0800 CST2022-06-23 08:58:55 +0800 CST 2022-06-23 08:58:55 +0800 CST

遏制浪费的内存授予 - MSSQL 2017

  • 772

我正在运行支持供应商软件的最新补丁/CU 级别的本地 SQL Server 2017 Enterprise,这将在稍后变得重要。

服务器统计:

  • 虚拟机(内存已固定)
  • Windows Server 2016 数据中心
  • 16 个虚拟 CPU
  • 192 GB RAM(179 GB 分配给 SQL Server)
  • 30 GB 页面文件(我宁愿这个不存在,但这不是我赢得的战斗)
  • 托管 5 个用户数据库,其中 1 个大小约为 4TB
  • 供应商要求的服务器默认值为 1max degree of parallelism

如上所述,该系统支持流行的供应商平台,虽然供应商在自定义索引或其他透明数据模型调整方面做得很好,但他们往往不赞成需要调整其应用程序代码的功能更改(原因很明显,因为这会影响成千上万的客户)。

我遇到的情况是这个供应商应用程序运行长时间运行的row mode查询,这些查询将在其应用程序代码中逐项处理的项目列表排队。如果我们允许这些查询可以(并且确实)运行数天甚至数周(ASYNC_NETWORK_IO如预期的那样显示等待)。当这些查询被启动时,他们请求的数量与他们真正需要SerialDesiredMemory的数量相比是巨大的。SerialRequiredMemory结果是MEMORYCLERK_SQLQERESERVATIONS内存管理员中的请求/授予的内存远远超过了使用的内存。例如:

-- What amount of query execution memory is asked for and used
SELECT    SUM(granted_memory_kb) / 1024 AS granted_memory_mb
        , SUM(requested_memory_kb) / 1024 AS requested_memory_mb
        , SUM(used_memory_kb) / 1024 AS used_memory_mb
        , (SUM(granted_memory_kb) - SUM(used_memory_kb)) / 1024 AS excess_memory_grant_mb
FROM    sys.dm_exec_query_memory_grants
OPTION (RECOMPILE)

回报:

在此处输入图像描述

这绝对是可怕的,这是在启用资源池RESOURCE GOVERNOR并将REQUEST_MAX_MEMORY_GRANT_PERCENT这些查询降至% 之后,尽管根据我所看到5的情况,我可能会一直将其降低到SQL 2017 的最小值。1

REQUEST_MAX_MEMORY_GRANT_PERCENT我的问题是,当我被困在 SQL 2017 时,除了进一步将资源池的价值降低到1%之外,我还能做些什么来限制查询执行计划中浪费的 RAM 数量?

由于这是一个供应商应用程序,因此查询计划指南可能是一种选择,但调整MAX_GRANT_PERCENT并没有给我带来任何好处,而不仅仅是调整REQUEST_MAX_MEMORY_GRANT_PERCENT资源池中的值。我可以在计划指南中做些什么来强制batch mode执行,希望这会触发 SQL 2017 中提供的批处理模式内存反馈功能?同样,由于这是我正在使用的供应商应用程序代码,因此我无法更改查询,因此标准的汤姆愚弄方法可能在这里不起作用。

升级到 SQL 2019(或者最好是 SQL 2022)是显而易见的答案,因为它使我可以访问在这种情况下可以使用的许多功能,例如行模式内存反馈和浮点值REQUEST_MAX_MEMORY_GRANT_PERCENT,但是还有其他可用的选项吗使用 SQL 2017 我还没有接触过?如果没有,那很好,我只是想用尽我还没有想到的任何出色的选择。

sql-server sql-server-2017
  • 1 1 个回答
  • 68 Views

1 个回答

  • Voted
  1. Best Answer
    Charlieface
    2022-06-23T13:16:59+08:002022-06-23T13:16:59+08:00

    如文档所述,即使在 SQL Server 2017 上,查询提示MAX_GRANT_PERCENT也允许浮点值低至 0.0,因此这仍然是一个选项。

    db<>小提琴

    所以你可以为此创建一个计划指南

    EXEC sp_create_plan_guide   
        @name = N'Guide1',   
        @stmt = N'SELECT Something
    FROM Somewhere',   
        @type = N'SQL',  
        @hints = N'OPTION (MAX_GRANT_PERCENT = 0.5)';  
    
    • 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