d-_*_*_-b 6 performance sql-server query-performance
我们的生产服务器(2012,VM + SAN)有 32 GB 的 RAM,数据库大小约为 80GB。该应用程序大量使用 TempDB - 磁盘读写都达到了 ~100 MBps。看到大量的 SQL 编译/秒......所有批处理请求的 95% 是编译。
理想情况下希望将 RAM 增加到 64GB 或 128GB,但需要向团队“证明”这是必需的。
缓冲区缓存命中率 (BCHR) 为 99.9%,但页面预期寿命 (PLE) 仅为 ~400。
对此有何解释?
我虽然 PLE 和 BCHR 有线性关系(即它们一起增加或减少)
在其他具有更大数据库和更多 RAM 的 VM 上,BCHR 和 PLE 都很高。
由于预读,BCHR 可能会非常具有误导性:
数据库引擎支持称为预读的性能优化机制。预读预期完成查询执行计划所需的数据和索引页,并在查询实际使用这些页之前将它们放入缓冲区缓存。这允许计算和 I/O 重叠,充分利用 CPU 和磁盘。[链接]
您很可能会看到预读预先填充缓冲区缓存的影响,这会扭曲 BCHR 计数器。Jonathan Kehayias 发表的题为Great SQL Server Debates: Buffer Cache Hit Ratio 的优秀且非常深入的文章涵盖了这一点。
PLE 只是告诉您最旧的页面在因内存压力而被逐出之前在内存中存储了多长时间。可能是您有高频的小查询命中缓存,也可能有大量查询刷新缓存并要求它们重新缓存。如果没有额外的数据,这看起来像是一个可能分为重型表(报告?)和 OLTP 的环境。或者您只是有很多小查询,但由于某种原因,缓存只是被快速地推出。
你提到它是虚拟的,如果是VMWare,你是否启用了气球驱动程序?如果是这样,可能会导致此问题。SQL Server 是否使用了所有分配的内存?我不确定您是否可以在您的环境中执行此操作,但您可以使用“锁定内存中的页面”进一步测试,但如果这是一个频繁使用的产品盒,无需额外测试,则不建议这样做。