根据我在Server 2008的阅读书籍,克里斯蒂安·博尔顿( Christian Bolton )、布伦特·奥扎尔( Brent Ozar )等人从伊利诺伊州当地图书馆借来的内部设备和故障排除。我试图在SQL server上寻求理解和确认,并在网上大量搜索,如果有人能确认或纠正我的理解,我将不胜感激。
每个需要查询内存授予的查询或操作都需要工作空间内存。在一般查询中,使用排序、哈希匹配连接、并行性(不确定)、批量插入(不确定)、索引重建等将需要查询工作区内存。
工作区内存是Server缓冲池的一部分(它作为缓冲池的一部分分配),最大工作区内存是分配给缓冲池的内存的75%。默认情况下,单个查询不能获得超过25%的工作区内存(在SQL 2008/SQL 2012中--由资源管理器默认工作负载组控制)。
寻求确认我的理解
1)考虑配置为40 GB的48 GB内存和最大服务器内存的系统,这是否意味着最大工作空间内存限制在30 GB以内,单个查询不能获得大于10 GB的工作区内存(查询内存)。因此,如果您有一个糟糕的查询,它处理了执行大量散列连接的数十亿行,并且需要超过10 GB的内存(工作区内存),那么它是否愿意通过这个内存分配队列,或者立即溢出到磁盘?
2)如果一个执行大规模排序操作的查询分配了一个5MB的工作区内存,并且在查询执行期间,如果查询优化器意识到由于统计错误或缺少索引,该查询实际上将需要30 MB的工作区内存,它将立即溢出到tempdb。即使系统在执行过程中有大量可用的工作区内存,一旦查询在执行过程中超过了授予的工作区内存,它也必须溢出到磁盘。我的理解正确吗?
发布于 2012-11-19 17:46:37
它是否愿意通过这个内存分配队列,或者立即溢出到磁盘?
不是这样的。一旦选择了需要内存授权的计划,查询就必须获得该授权,以便它通过队列。溢出(如果有的话)在执行周期中会发生得更晚。如果没有授权和“泄漏”,查询就不能决定继续进行。它必须获得授权,并在此基础上开始执行。如果赠款结果是不够的(由于错误的估计或由于获得的赠款比请求的低得多),那么查询将被迫溢出。
如果查询优化器意识到,由于统计数据差或缺少索引,
严格地说,这不是优化器,而是查询执行。查询优化器在决定计划方面只有发言权,但是一旦计划被选择并启动到执行中,优化器就不存在了。此外,“缺少索引”在这里不起作用。缺少索引可能会强制执行糟糕的计划,但它不会影响该“坏”计划的执行方式,因为该计划是根据实际存在的索引构建的,因此它知道它能做什么,不能做什么。泄漏的发生几乎总是由于错误的估计。在优化器和执行过程中,糟糕的统计数据或糟糕的基数估计算法(如果您深入了解细节,就会变得非常复杂,所以我将在这里结束)。
即使系统在执行过程中有大量可用的工作区内存,一旦查询在执行过程中超过了授予的工作区内存,它也必须溢出到磁盘。
不幸的是,是的。然而,优化器应该想出一个利用可用RAM的计划。
我推荐你阅读理解SQL server内存授予,这是关于这个主题的最好的信息。
https://dba.stackexchange.com/questions/28930
复制相似问题