工作区内存内部


13

根据克里斯蒂安·博尔顿,布伦特·奥扎尔等人撰写的有关SQL Server 2008内部和故障排除(从伊利诺伊州本地图书馆借来的)的阅读书。可以确认或纠正我的理解。

每个需要查询内存授予的查询或操作都将需要工作空间内存。在使用排序,哈希匹配联接,并行性(不确定),批量插入(不确定),索引重建等的一般查询中,将需要查询工作区内存。

工作区内存是SQL Server缓冲池的一部分(分配为缓冲池的一部分),最大工作区内存为分配给缓冲池的内存的75%。默认情况下,单个查询不能获得超过25%的工作空间内存(在SQL 2008 / SQL 2012中-由资源调控器默认工作负载组开箱即用)。

寻求我的理解的确认

1)考虑具有48 GB RAM和最大服务器内存配置为40 GB的系统,这是否意味着最大工作空间内存限制为30 GB,并且单​​个查询不能获取超过10 GB的工作空间内存(查询内存)。因此,如果您有一个错误的查询要处理大量的哈希联接的十亿行,并且需要超过10 GB的内存(工作空间内存),那么是否还要遍历此内存授予队列或立即溢出到磁盘?

2)如果为执行大规模排序操作的查询分配了5 MB的工作空间内存,并且在查询执行期间查询优化器意识到由于统计错误或缺少索引,此查询实际上将需要30 MB的工作空间内存将立即溢出到tempdb。即使系统在执行期间有足够的工作区内存,一旦查询在执行期间超出了授予的工作区内存,它也必须溢出到磁盘上。我的理解正确吗?

Answers:


13

甚至需要遍历此内存授予队列还是立即溢出到磁盘?

那样行不通。一旦选择了需要内存授权的计划,查询就必须获得授权,才能通过队列。溢出(如果有的话)在执行周期的较晚时间发生。查询无法决定继续执行是否没有授予和“溢出”操作。它必须获得资助,并在此基础上开始执行。如果拨款证明不足(由于估算错误或由于获得的拨款比要求的少得多),则查询将被强制溢出。

如果查询优化器意识到由于错误的统计信息或缺少索引而导致

严格来说不是优化器,而是查询执行。Query Optimizer在决定计划时只有发言权,但是一旦选择了计划并将其启动执行,该优化器便会消失。同样,“丢失索引”在这里不起作用。缺少索引可能会导致制定糟糕的计划,但是由于该计划是在考虑到实际存在的索引的情况下构建的,因此它无法影响该“不良”计划的执行方式,因此它确切地知道可以做什么和不能做什么。溢漏几乎总是由于估计错误而发生,即。优化程序执行过程中的统计信息或基数估计算法不正确(如果您深入研究细节,将会变得非常复杂,因此我将在此处停止)。

即使系统在执行期间有足够的工作区内存,一旦查询在执行期间超出了授予的工作区内存,它也必须溢出到磁盘上

不幸的是。但是,优化器应该提出一个利用可用RAM的计划。

我建议你阅读理解SQL服务器内存授权是由一个主题的最佳信息广裕度。


4
Remus Rusanu(MSFT)在网络搜索期间,我还调查了您的博客文章,该文章涉及需要查询内存授权的运营商。谢谢您,是支持此论坛的真正宝石。
SQL学习者2012年


雷木思(Remus),亚当·马汉尼(Adam Machanic)的PASS峰会非常彻底,并阐明了与工作区内存有关的任何问题。
SQL学习者2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.