我想为每个执行的存储过程保存一些内存参数 - requested_memory_kb
, granted_memory_kb
, max_used_memory_kb
。
sys.dm_exec_query_memory_grants
我计划在执行的开始和结束时找到它们@@SPID
。
取这个值是否正确?或者max_used_memory_kb
执行结束时可以小于存储过程执行期间?
我们记录程序的某些信息(参数、执行开始/结束时间等),我想添加到这些额外信息以查看具有大量授予内存但使用率低的程序。
把我缓存在外面
您可以使用sp_BlitzCache,按未使用的内存授予排序,并将其记录到表中。
如果您将其坚持在大约每小时运行一次的代理作业中,您应该很清楚哪些查询需要最多的内存,并且不会最终使用它。
扩展事件或 XEvents 可能是解决此问题的最佳方式。
XEvents 是 SQL Server 中内置的一种非常高效且用途广泛的日志记录框架。
您需要事件
query_memory_grant_usage
或query_memory_grants
事件,具体取决于您是需要每次执行的数据,还是需要每 5 分钟聚合一次的查询信息。SSMS 也为此提供了一个很好的向导。
您甚至可以设置过滤器,并捕获全局字段,例如
client_hostname
或plan_handle
。