sql-server - SQL Server 高估了执行计划,授予了 GB 的 RAM,但查询实际上只使用了 MB
问题描述
我们管理着近十几个 SQL Server 2016 Enterprise 实例,所有这些实例都发生了这种情况:查询所需的内存被高估了。实际高估,在 GB 级别。
大多数服务器都有 512 或 256 GB 的 RAM,所以据我所知,SQL Server 的设计将 75% 的专用内存用于查询(工作区内存),从这 75% 开始,它可能会占用最多 25% 作为授予的最大值每个查询的内存。好吧,这会导致我们进行查询——我知道的错误查询(在查看后进行几次连接、排序和查看,查询成本为数千)有时会被授予约 45 GB 的 RAM(约 75% 的 25%)。
如下图所示,问题在于:
请求和授予的内存都比所需的和实际使用的内存要好得多。
我已经尝试过了,但无济于事:
- 刷新执行计划缓存
- 强制对表进行统计更新
- 在这些查询上手动指定重新编译
- MAXDOP 的不同设置(它只对“必需”内存有任何影响,而不是“请求/授予”)
因此,从 SQL Server 的工作方式来看,只需要 5-6 个请求内存事务估计不佳(例如,每个 45 GB)将所有其他剩余查询引导到 RESOURCE_SEMAPHORE 等待队列(因为 SQL Server 认为“请求的”内存,而不是将会话放入资源信号量时的“必需”内存)。
你有什么想法或建议吗?
解决方案
推荐阅读
- python - 使用 python for 循环将硬代码更改为更灵活
- python-3.x - 在 pdf 文件 python 中绘制图形
- 3d - 平行于相机视图的区域光
- rest - 如何使用 v-for 标签显示数据中的元素?
- c++ - 我的 C++ 函数中存在向量大小不增加的问题
- php - PHP 将字符串转换为 int 内存使用情况:我应该将字符串数字转换为 int 数字吗?
- ionic-framework - 修复 TS2345:“HTMLElement”类型的参数不可分配给“HTMLInputElement”类型的参数
- mysql - 为什么在 AWS(Lightsail 和 EC2)上运行的 Ubuntu 18.04 上安装 MYSQL 服务器后出现 ssh 连接错误?
- java - 运行按钮显示为灰色 - intellij
- python - 在 Blender 的 Python 中安装 Dlib 时出错