根据克里斯蒂安·博尔顿,布伦特·奥扎尔等人撰写的有关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。即使系统在执行期间有足够的工作区内存,一旦查询在执行期间超出了授予的工作区内存,它也必须溢出到磁盘上。我的理解正确吗?