抱歉,很长,但是我想给您尽可能多的信息,以便对分析有所帮助。
我知道有几个帖子有类似的问题,但是,我已经关注了网上发布的这些帖子和其他信息,但是问题仍然存在。
我在SQL Server中遇到严重的性能问题,这使用户发疯。这个问题持续了好几年,直到2016年底由另一个实体管理,从2017年开始由我管理。
在2017年中,我能够按照Microsoft SQL Server 2012性能仪表板报告中指示的索引提示解决问题。效果是立竿见影的,听起来像魔术。在过去的日子里,几乎总是100%的处理器变得超级宁静,并且用户的反馈声也很高。甚至我们的ERP技术人员也很高兴,因为通常需要20分钟才能获得某些清单,最后他可以在几秒钟内完成。
但是,随着时间的流逝,它开始慢慢恶化。我避免创建更多索引,因为担心过多的索引会降低性能。但是在某些时候,我不得不删除那些没用的东西,并创建Performance Dashboard向我建议的新东西。但没有影响。
在ERP中进行保存和咨询时,感觉到的缓慢本质上。
我有专用于SQL Server 2016 Enterprise(64位)的Windows Server 2012 R2,具有以下配置:
- 处理器:Intel Xeon CPU E5-2650 v3 @ 2.30GHz
- 记忆体:84 GB
- 在存储方面,服务器具有专门用于操作系统的卷,专门用于数据的卷和专门用于日志的卷。
- 17个数据库
- 使用者:
- 在最大的数据库中,大约有113个用户并发连接
- 另外约有9位使用者
- 其中两个是3 + 3
- 其余各只有1个用户
- 我们有一个网站,它也为较大的数据库编写数据,但是使用情况不那么常规,应该有大约20个用户。
- 数据库大小:
- 最大的数据库有290 GB
- 第二大有100GB
- 第三大有20 GB
- 第四个14 GB
- 其余各只有3 GB以上
这是生产实例,但我们也有一个开发实例,我相信可以为此忽略它,因为在大多数情况下,我是唯一的连接对象,但是即使没有连接,该问题也会不断发生。
处理器几乎总是这样:
我们的例程在夜间运行(没有问题),而某些例程在白天运行。
用户通过远程桌面连接到由ODBC 32配置为访问SQL Server的其他计算机。
服务器所在的数据中心以及我所在的位置都具有100/100 Mbps。大多数站点通过MPLS链接,而其他站点则通过IPSec(从FO到4G)链接。提供商进行了许多分析,电路还可以。
缓存命中率为99%(用户请求和用户会话)
等待看起来像这样:
我已经使用Perfmon收集了数据,如果对您的分析有所帮助,我将获得结果-就个人而言,我没有从分析中得出任何结论。
我依靠您的支持来解决此问题,可以为您提供解决该问题所需的信息。
非常感谢你。
这是sp_blitz降价促销(我用假名替换了公司名称):
优先级1:可靠性:
过去2周以上的上次好DBCC CHECKDB
- 主
模型-上一次成功的CHECKDB:2018-02-07 15:04:26.560
msdb-上一次成功的CHECKDB:2018-02-07 15:04:27.740
优先级10:效果:
带奇数内核的CPU
节点0分配有5个核心。这是非常差的NUMA配置。
节点1分配有5个核心。这是非常差的NUMA配置。
优先级20:文件配置:
- C驱动器上的TempDB tempdb-tempdb数据库在C驱动器上具有文件。TempDB经常会意外地增长,从而使您的服务器面临C驱动器空间用尽并严重崩溃的风险。C通常也比其他驱动器慢得多,因此性能可能会受到影响。
优先级50:可靠性:
- 最近在默认跟踪中记录的错误
- master-2018-03-07 08:43:11.72登录错误:17892,严重性:20,状态:1. 2018-03-07 08:43:11.72登录登录由于触发执行而无法登录到example_user。[客户:IPADDR]
(注意:由于启用了触发器而限制了用户会话,因此出现许多此类错误-用于ERP许可使用控制)
页面验证不是最佳的
DATABASE_A-数据库[DATABASE_A]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_B-数据库[DATABASE_B]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_C-数据库[DATABASE_C]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_D-数据库[DATABASE_D]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_E-数据库[DATABASE_E]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_F-数据库[DATABASE_F]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_G-数据库[DATABASE_G]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_H-数据库[DATABASE_H]的NONE用于页面验证。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_I-数据库[DATABASE_I]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_Z-数据库[DATABASE_Z]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_K-数据库[DATABASE_K]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_J-数据库[DATABASE_J]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_L-数据库[DATABASE_L]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_M-数据库[DATABASE_M]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_O-数据库[DATABASE_O]的NONE用于页面验证。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_P-数据库[DATABASE_P]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_Q-数据库[DATABASE_Q]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_R-数据库[DATABASE_R]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_S-数据库[DATABASE_S]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_T-数据库[DATABASE_T]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_U-数据库[DATABASE_U]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_V-数据库[DATABASE_V]的NONE用于页面验证。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
DATABASE_X-数据库[DATABASE_X]没有用于页面验证的内容。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。
禁用远程DAC-未启用对专用管理连接(DAC)的远程访问。当SQL Server没有响应时,DAC可以使远程疑难解答变得更加容易。
优先级50:服务器信息:
- 未启用即时文件初始化-考虑启用IFI,以实现更快的还原和数据文件的增长。
优先级100:效果:
填充系数已更改
DATABASE_A-[DATABASE_A]数据库具有417个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_B-[DATABASE_B]数据库具有318个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_C-[DATABASE_C]数据库具有346个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_D-[DATABASE_D]数据库具有663个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_E-[DATABASE_E]数据库具有335个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_F-[DATABASE_F]数据库具有1705个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_G-[DATABASE_G]数据库具有671个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_H-[DATABASE_H]数据库具有2364个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_I-[DATABASE_I]数据库具有1658个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_Z-[DATABASE_Z]数据库具有673个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_K-[DATABASE_K]数据库具有312个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_J-[DATABASE_J]数据库具有864个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_L-[DATABASE_L]数据库具有1170个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_M-[DATABASE_M]数据库具有382个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_O-[DATABASE_O]数据库具有356个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
msdb-[msdb]数据库具有8个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_P-[DATABASE_P]数据库具有291个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_Q-[DATABASE_Q]数据库具有343个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_R-[DATABASE_R]数据库具有2048个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_S-[DATABASE_S]数据库具有325个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_T-[DATABASE_T]数据库具有322个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_U-[DATABASE_U]数据库具有351个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_V-[DATABASE_V]数据库具有312个对象,填充系数= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
DATABASE_X-[DATABASE_X]数据库具有352个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
tempdb-[tempdb]数据库有2个对象,填充因子= 70%。这可能会导致内存和存储性能问题,但也可能阻止页面拆分。
一个查询的许多计划-在计划缓存中为单个查询提供了20763个计划-这意味着我们可能存在参数化问题。
启用服务器触发器-启用服务器触发器[connection_limit_trigger]。确保您了解触发器的作用-所做的工作越少越好。
带RECOMPILE的存储过程
master-[master]。[dbo]。[sp_AllNightLog]在存储过程代码中具有WITH RECOMPILE,由于代码的不断重新编译,可能会导致CPU使用率增加。
master-[master]。[dbo]。[sp_AllNightLog_Setup]在存储过程代码中具有WITH RECOMPILE,由于代码的不断重新编译,可能会导致CPU使用率增加。
优先级110:效果:
没有聚簇索引的活动表
DATABASE_A-[DATABASE_A]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_B-[DATABASE_B]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_C-[DATABASE_C]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_E-[DATABASE_E]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_F-[DATABASE_F]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_H-[DATABASE_H]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_I-[DATABASE_I]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_K-[DATABASE_K]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_O-[DATABASE_O]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_Q-[DATABASE_Q]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_S-[DATABASE_S]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_T-[DATABASE_T]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_U-[DATABASE_U]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_V-[DATABASE_V]数据库具有正在被主动查询的堆-没有聚集索引的表。
DATABASE_X-[DATABASE_X]数据库具有正在被主动查询的堆-没有聚集索引的表。
优先级150:效果:
(注意:Nany的建议在这里,但是由于字符的限制,我不能包括它们。如果还有其他共享的方法,请指出。)