我有一个小型 SQL Server Standard 实例,我在上面运行 HammerDB TPC-H (1 GB) 基准测试。它有一些配置问题,尽管它将所有内容都写入tempdb
磁盘,而且tempdb
由于我的物理存储速度很慢,这似乎让我感到瓶颈:
数据库本身大约 3.5 GB,服务器有 16 GB RAM。
我的理解是,tempdb
仅在服务器处于内存压力下时使用,但它甚至从未达到 30% 的使用率。Physical_memory_in_use_kb
永远不会超过 3 GB,尽管它会随着时间的推移稳步增长。VMware 主机也没有任何明显的问题。
sp_blitz
结果警告高 CPU 使用率 (~75-85%),仅此而已。
这是群集中 SQL Server Standard 的几乎默认安装 -tempdb
在这些运行时间较长的基准查询的情况下,这种写入行为是否正常?如果没有,我可以从哪里开始故障排除?
回应评论:
- 在服务器属性 > 内存中将最大内存设置为 14336 GB
- 带有 tcph 查询的相关hammerdb 代码:https ://pastebin.com/AwJ000Qp
- 示例计划文件(上面的查询 #18): https ://www.brentozar.com/pastetheplan/?id=B1CkC9kE4
这并不完全正确。有很多事情会导致 tempdb 使用:
#tempTableName
或##tempTableName
)。我想这不是你的问题您的问题很可能是溢出。有关一些良好的一般信息和特定故障排除步骤的链接,请查看 Paul White 对问题的答案,即散列/排序溢出到 tempdb 中的频率是多少?
如果某些最有问题的查询仍在您的计划缓存中,您还可以运行
sp_BlitzCache @SortOrder = 'spills'
(从First Responder Kit中)查找它们。至于处理溢出,您可以发布有关错误查询的单独问题,并且可能会在解决导致溢出的任何问题(错误的基数估计、小内存授予等)方面获得帮助。
内存压力会导致低内存授予,这会导致 tempdb 溢出——这就是为什么我说你最初关于内存压力的断言并不完全正确——因为有时它是正确的!
您提供的执行计划是一个估计的执行计划,因此它不指示是否有任何运算符溢出到 tempdb。但它确实有多个消耗内存的运算符(特别是排序),因此它有可能生成 tempdb 活动。