当我们执行SQL查询时,关系引擎对其进行优化,并将查询计划传递给存储引擎,然后存储引擎请求一个包含实际数据的页面。
如果数据页不在内存中,则SQL从磁盘中提取这些页面并将其放入RAM中。
将来,SQL如何确定哪个存储引擎询问的页面是否已经在内存中?它使用哪种算法来为新页面保留一些空闲空间?
发布于 2014-03-28 13:48:45
将来,SQL如何确定哪个存储引擎询问的页面是否已经在内存中?
为了平衡CPU和I/O吞吐量以获得良好的性能和最大限度的硬件利用率,Server包括2种异步I/O机制--先读顺序读取和随机预取
当Server必须扫描大型表时,存储引擎将启动预读机制,以确保页面在内存中,并且在查询优化器需要页面之前就可以进行扫描。
如果您使用的是企业版,那么有一种名为高级扫描或旋转扫描的机制,它将允许多个任务共享完整的表扫描。这种预先扫描避免了用户争夺缓冲区空间和对服务器上的其他资源征税。
它使用哪种算法来为新页面保留一些空闲空间?
SQL Server (以及Sybase也是:-)使用LRU (最近使用最少的)算法来跟踪缓冲池中已老化的页面。每次引用页面时,它都会增加一个计数器,并在懒散的写入程序每次扫页时减少计数器。
任何工作线程都将检查缓冲区池的内存状态,以确保有足够数量的空闲页面来满足传入的新请求。
注意: Server总是在空闲列表中保留最少数量的空闲页面,这样它就可以在没有任何延迟的情况下为传入的请求提供服务。可用空间的大小是根据缓冲区池和传入请求的数量计算的。
如果没有免费缓冲区或只剩下很少的缓冲区,那么:
您可以使用DMV (2005年及以上)- sys.dm_os_buffer_descriptors来查找缓冲池中的页面。
此外,还有服务器2012中内存管理器表面积的变化。
从Server 2012开始,多页分配和CLR分配也包含在由最大服务器内存(MB)和最小服务器内存(MB)控制的内存限制中。此更改为通过Server内存管理器进行的所有内存需求提供了更精确的大小调整功能。在升级到server 2012之后,仔细检查当前的最大服务器内存(MB)和最小服务器内存(MB)值。
强烈建议改为:
https://dba.stackexchange.com/questions/61975
复制相似问题