SQL*_*ner 13 sql-server-2008 sql-server-2012
根据我阅读的关于 SQL Server 2008 Internals and Troubleshooting(从伊利诺伊州的当地图书馆借来)的书籍,Christian Bolton、Brent Ozar 等。我试图在 SQL Server 上寻求理解和确认,并在网上进行大量搜索,如果有人,我将不胜感激可以确认或更正我的理解。
每个需要查询内存授予的查询或操作都需要工作空间内存。在使用排序、哈希匹配连接、并行(不确定)、批量插入(不确定)、索引重建等的一般查询中,将需要查询工作区内存..
工作区内存是 SQL Server 缓冲池的一部分(它作为缓冲池的一部分分配),最大工作区内存是分配给缓冲池的内存的 75%。默认情况下,单个查询无法获得超过 25% 的工作区内存(在 SQL 2008/SQL 2012 中——由开箱即用的资源调控器默认工作负载组控制)。
寻求确认我的理解
1) 考虑到具有 48 GB RAM 和最大服务器内存配置为 40 GB 的系统,这是否意味着最大工作区内存限制为 30 GB,并且单个查询不能获得超过 10 GB 的工作区内存(查询内存)。因此,如果您有一个处理 10 亿行进行大规模散列连接的错误查询,并且需要超过 10 GB 的内存(工作区内存),它甚至会关心通过此内存授予队列或立即溢出到磁盘吗?
2) 如果执行大规模排序操作的查询已分配 5 MB 的工作空间内存,并且在查询的查询执行期间,如果查询优化器意识到由于错误的统计信息或缺少索引,该查询实际上需要30 MB的工作空间内存将立即溢出到 tempdb。即使系统在执行期间有足够的工作空间内存可用,一旦查询在执行期间超过授予的工作空间内存,它也必须溢出到磁盘。我的理解是否正确?
Rem*_*anu 14
它甚至会关心通过这个内存授予队列还是立即溢出到磁盘?
它不会那样工作。一旦选择了需要内存授权的计划,查询必须获得授权才能通过队列。溢出(如果有)发生在执行周期的后期。查询不能决定在没有授权和“溢出”的情况下继续。它必须获得授权,并在此基础上开始执行。如果授权结果不足(由于错误估计或由于获得的授权比请求的少得多),则查询将被迫溢出。
如果查询优化器意识到由于错误的统计信息或缺少索引
严格来说,它不是优化器,而是查询执行。查询优化器在决定计划方面只有发言权,但是一旦选择了计划并开始执行,优化器就无法参与了。此外,“缺失索引”在这里不起作用。一个缺失的索引可能会导致一个糟糕的计划,但它不能影响这个“糟糕”计划的执行方式,因为该计划是根据实际存在的索引来构建的,因此它确切地知道它可以做什么和不能做什么。溢出几乎总是由于错误的估计而发生,即。优化器和执行中的不良统计数据或不良基数估计算法(如果您深入研究细节,它会变得非常复杂,所以我会在这里停止)。
即使系统在执行期间有足够的工作空间内存可用,一旦查询在执行期间超过授予的工作空间内存,它也必须溢出到磁盘
不幸的是,是的。然而,优化器应该提出一个利用可用 RAM 的计划。
我建议你阅读理解SQL服务器内存授予,这是由这一主题的最佳信息广裕度。