And*_*res 5 performance sql-server entity-framework fragmentation sql-server-2012
我正在 AWS 实例上运行 SQL Server Express 12.0.4100,该实例具有 16 个内核和 64 GB RAM,附加了 3TB 和 9000 IOPS EBS。这已经完美运行了 2 年,直到本周都没有问题。
服务器正在运行一个 web 应用程序,每秒接收 5-10 个请求,每个请求都被转换为对数据库的相同查询,只是参数不同(这都由 ORM 处理)。这些查询(我们称之为GetProduct查询)有点大,因为它们从 13 个表中检索数据以构建发送回给用户的单个 JSON 响应。查询通常需要 800 到 1500 毫秒的时间才能运行。
本周我注意到,当我执行一个查询时,一个简单的选择前 1000 个表中的单个 where 条件也被GetProduct查询扫描,SQL Management Studio 报告的数据库 I/O 使用率上升,在 30MB/s 之间波动和 50MB/s,即使我的查询已经返回(正常的数据库 I/O 在 0.1MB/s 和 1MB/s 之间)。我突然发现我的GetProduct查询现在需要 60 多秒才能完成!导致超时和对数据库执行的所有查询变得非常缓慢。如果我重新启动整个服务器框,这是固定的,一切都会恢复正常,直到我再次运行一个非常奇怪的查询。
我远非数据库专家,我是一名程序员,也负责维护这个数据库,团队中没有一个人对数据库了解很多。我更新了统计数据并注意到我的大多数索引的碎片化程度非常高(SSMS 报告的 95% 到 99% 之间)。我正在计划一个维护窗口,以便我可以删除应用程序并重建所有索引。
碎片会导致这种行为吗?我执行了sp_whoisactive,我确定我的数据库上没有其他任何东西在运行,只是调用GetProduct查询需要很多时间才能完成。
更新
我使用 SSMS 活动监视器中的“最近昂贵的查询”部分获得了查询计划,因为此查询sp_whoisactive @get_plans = 1返回 NULL query_plan。
我无法使用 Pastebin,因为文件太大,所以我将它们上传到我的 Google Drive 帐户:
sp_updatestats,出于某种原因,现在导致问题的其他查询不再发生。运行后sp_updatestats但它会导致问题,查询计划与慢查询:https : //drive.google.com/open?id=1lWrlljgtrGnYPGLjCZe_Hq_uCNqaRHko这是正在执行的查询,唯一更改的参数@p__linq__0是由不同的 UUID 替换:https : //pastebin.com/YnrCJVLW
最后,您可以在此处看到sp_whoisactive @get_plans = 1查询花费大量时间完成时的输出:
我想发布显然适合我的案例的解决方案。上周末我取下了该应用程序进行维护,并重建了数据库的所有索引(通过 SMSS UI),然后进行了统计更新,我很高兴地说,从那时起我们就没有再遇到这个问题了。
在此之前我已经重建了统计数据,但它没有帮助,如果问题与索引碎片有关,那么查询应该一直很慢,但出于某种原因,它在我的情况下有效。
谢谢大家的时间和建议!