dax*_*axu 4 sql-server execution-plan plan-cache
我的公司有一些使用大量动态查询(无参数)的遗留系统。在较新的系统中,我们使用存储过程和参数化 SQL。然而,我们发现我们的存储过程经常出现性能峰值。
我查看了它,似乎计划缓存会定期清除存储过程计划,但在计划缓存中保留了大量动态 SQL 语句。
我对 SQL Server (SQL Server 2017) 这样做的原因有点困惑。SQL Server 如何决定删除哪一个?
缓存计划通常仅在内存压力下从计划缓存中删除。
SQL Server 在决定删除哪些计划时主要考虑计划的成本。在高成本计划之前删除损失成本计划。这里的“成本”与您在查看执行计划时看到的“计划成本”并不直接相同——它是一种与缓存相关的成本计算机制。
当 SQL Server 检测到内存压力时,它会从缓存中删除零成本计划,然后将剩余计划的成本降低 50%。对于临时计划,计划的成本被认为是零,但是每次重复使用该计划时,该成本都会增加一。如果您启用了“优化临时计划”,则您在缓存中看到的动态查询可能已被大量使用,因此具有“高”缓存成本,并且不会被逐出。对于非临时计划,该计划的成本是不是一个计划每次使用时增加,但保持在原来的计划成本,这是根据所执行的计划成本。您可以在sys.dm_exec_cached_plans
DMV 中查看特定计划的使用次数。
缓存成本以称为“滴答”的单位来衡量,最多为 31。滴答按此递增:
一旦计划缓存达到其容量的 50%,滴答就会开始减少。此时,SQL Server 启动一个资源监视器线程,每次缓存被另一个计划填充时,该线程将每个计划的滴答计数减 1。
该sys.dm_os_memory_cache_entries
DMV包含哪些对象是在缓存中,与原来的和当前的成本转嫁给,除其他一些有用的指标的详细信息。
上面列出的详细信息基于Kalen Delaney在SQL Server Internals 中找到的详细信息。