最近,我们将其中一台生产服务器从 SQL Server 2016 升级到了 SQL Server 2019 (CU 15)。这对我来说是在我们的主应用程序数据库上启用查询存储的绝佳机会。它已经运行了几天,这就是总体资源消耗报告显示的内容:
在屏幕截图中,我挑选了一些看起来很疯狂的数字(在启用查询存储的第一天)并将它们标准化为更容易讨论的度量单位。一天之内,逻辑读取消耗约 183 TB 的数据,或内存消耗约 5 TB的数据,在此服务器上似乎几乎是不可能的。
这个数据库是数据库中的 John Smith,数据文件只有100 GB ,日志文件只有200 GB。最多可能有 100 个不同的用户全天连接到它,而且一天内不会创建大量交易。服务器本身只为其配置了32 GB的内存。要消耗5 TB的内存,分配的内存需要在一天内被填满150 次以上。
我能想到的唯一其他可能相关的信息是在升级之后,我们立即将此数据库的“兼容性级别”设置为 150(SQL Server 2019)并关闭“旧基数估计”设置。我知道这并不理想,最好在收集基线指标时让尘埃落定,但升级的部分原因是为了解决一些紧急的性能问题,这些设置组合实际上在我们的测试中最有效(而且似乎仍然工作得很好)。
我们之前遇到的一些性能问题是由于疯狂的基数估计,如果查询存储使用估计的数据点,那么我实际上可以看到这个报告的数字是相关的,但我不得不想象报告是使用实际数据点?虽然如果这是另一个迹象表明我的生产服务器/数据库在我持续征服以解决基数估计问题时配置方式存在根本性错误,那将会很有趣。
我读错了这些数字,是查询存储出错了,还是我的服务器吐司?
我的工作站可以做大约 100K-150K LIO/CPU 秒。逻辑 IO (LIO) 正在从页面缓存中读取单个 8KB 页面。即,当使用简单的查询计划对缓存表进行大并行扫描时,我会得到如下 IO 统计信息:
使用 MAXDOP 1,同样的扫描只需要 3625 CPU 毫秒。它运行 Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz。
在此期间,您有 22,902,891,616KB 的逻辑 IO,其中每个 LIO 为 8KB,因此
22902891616/8
LIO 和 20,393,171 毫秒的 CPU 时间。所以或者
140,383 LIO/CPU 秒。因此,逻辑 IO 的数量大致对应于总 CPU 使用率,并且您在 24 小时内平均为 33,000 LIO/秒。
鉴于您使用所有更新的优化器行为升级到 2019,您可能有一些导致过度扫描的错误计划,但是服务器的速度和适中的大小使您的缓存命中率保持非常高,并保持感知性能可接受。
我不确定那个内存指标是什么意思。这是报告背后的查询:
和
在我看来,这不是一个非常有用的指标。
作为一般评论,我认为这里的任何人都不能100%自信地回答您的问题。我们没有基线。不过,这里有一些关于您可以做什么的想法:
您是否在两台服务器上收集了任何指标?你能比较它们吗?
对于所有查询,弹出窗口中的数字似乎是整个数据库的累积值。如果我的数学是正确的,平均查询持续时间是 400 毫秒。这可以和旧服务器相提并论吗?
比较 CPU 使用率。一天是 5,5h 在新服务器上。假设 1 个逻辑 CPU,它的 CPU 平均使用率约为 25%。假设有 2 个逻辑 CPU,它是 12.5% 等。我们没有任何一个服务器的数字,但是知道两者的平均 CPU 使用率和逻辑处理器数量,您应该能够比较这两个服务器的 CPU 时间。假设有 2 个逻辑 CPU,我会说使用率很低。等待统计数据也相对较低(我假设屏幕截图中的等待时间表示等待)。因此,除非您有毒药等待,否则我认为您很好。
一般来说,我会比较新旧服务器之间的等待统计信息。如果新服务器等待的时间更少,那么很可能你没问题。
最后:用户是否抱怨应用程序的某些部分现在变慢了?这将强烈暗示某些查询已倒退。