在 SQL 2017 中有一个新的执行指标,“日志内存”,除了它是在 2017 年添加的,我没有找到任何关于它的信息。
执行指标:(SQL 2017)
CPU 时间、持续时间、执行计数、逻辑读取、逻辑写入、内存消耗、物理读取、CLR 时间、并行度 (DOP)、行数、日志内存、TempDB 内存和等待时间
我相信我了解所有其他指标是什么以及我可能关心的原因。
我在几个特定时期运行了前 5 个资源消耗查询的所有指标。我记录下来,现在我正在检查结果。我知道“日志内存”的(非常大的)值以 KB 为单位。
“日志内存”指标究竟是什么?
编辑,收到我检查过的两个答案
LowlyDBA的回答表明它是 5 个相关字段的组合sys.query_store_runtime_stats
我创建了数据库“231682”并运行了 5 个字段的测试查询,我得到的结果非常相似
我总结(在 Excel 中使用=SUM()
)我的值并得到 1,383,040(字节)
我查看了查询存储,对于使用的日志内存 (KB),它显示的值为 354,058,240 (KB),这个数字大了几个数量级,与字节相比也是 KB,以字节为单位为 354,058,240,000 (字节)
我把所有字段加起来,只得到1,655,236(byte)
SELECT *
FROM sys.query_store_runtime_stats qsrs
WHERE qsrs.avg_log_bytes_used > 0;
我怀疑我的问题的答案是 SQL 2017 中的“日志内存”指标没有任何实际价值。这个小实验中显示的值是 354GB,高得不切实际。
如果我们查看底层对象的文档
sys.query_store_runtime_stats
,我们会看到它具有以下描述:注意: Azure SQL 数据仓库将始终返回零 (0)。
注意: Azure SQL 数据仓库将始终返回零 (0)。
注意: Azure SQL 数据仓库将始终返回零 (0)。
注意: Azure SQL 数据仓库将始终返回零 (0)。
注意: Azure SQL 数据仓库将始终返回零 (0)。
LowlyDBA 的回答涵盖了指标的实际含义。 这个答案只是为了解释为什么查询存储用户界面中的数字并不完全有意义。
获取一些日志数据
首先,让我们在笔记本电脑上的 SQL Server 2017 Developer Edition 上获取这些列中的数据。
创建数据库:
使用非常不切实际的设置启用查询存储:
做一些会产生一些事务日志使用的事情:
如果尚未发生,则强制刷新到磁盘:
瞧:
计算题
从查询存储用户界面的角度来看,正在运行的计算如下所示:
计算中有一个错误,从字节到千字节应该除以 1,024。就目前而言,它将字节乘以 1,024,然后将它们报告为千字节 - 这使得它们看起来相差约 1,000,000 倍。
例如,我的重现在执行 1 次查询后产生了 346,796 字节的日志。查询存储用户界面显示的不是 338 KB,而是 355,119,104 KB。
我已经向 Microsoft 报告了这个问题:Query Store "Log Memory Used" metric calculation is wrong