【发布时间】:2012-03-08 17:55:55
【问题描述】:
我有一个 ASP.NET 2.0 Web 应用程序,该应用程序由一个非常复杂的 SQL Server 数据库(大量表和大量查询发生在大量连接)支持。我的日志显示有一天,一种特定页面类型的服务器端加载时间显着增加。它通常低于 100 毫秒,但有时会上升到 200 毫秒左右,然后达到 600 毫秒以上,并且从那以后(就在一周前)一直存在。上一次我们将新代码迁移到生产环境几乎是在这之前的两周,当时并没有大量的新数据进入系统。
我在我们的测试环境中查看了这种行为异常的页面类型(当然,它不如生产环境那么强大),发现它的平均时间约为 450 毫秒,这比我想要的要高,但没有生产环境那么高。这很奇怪;我预计测试环境的运行速度会比生产环境慢,因为它们拥有基本相同的数据集。
我将其缩小到一个数据库调用(一行 C#),它需要将近 200 毫秒来调用一个存储过程并将结果组装到 .NET 对象中(大部分时间都在数据库中)。我提取了那个存储过程,复制了它的主体,并让 SQL Server 管理器告诉我估计的执行计划。它告诉我缺少一个我创建的非聚集索引;这使得有问题的数据库调用时间低于 100 毫秒。更多调查表明,该页面类型没有其他显着的性能下降。
所以我做了一些改进,我很想在生产中创建该索引,看看页面加载时间是否显着减少。但是我仍然有一些问题困扰着我,我更愿意在生产中搞砸之前回答这些问题:
- 为什么性能会突然下降?如果它只是一个缺失的索引,我希望它一直是一个因素(随着更多数据的添加,性能会慢慢下降)。
- 如果具有相同的数据集,为什么测试会比生产性能更好?
我知道没有人可以告诉我关于我的应用程序的信息,但我希望能够深入了解哪些类型的事情会发生这样的变化并且是特定于安装的。
编辑:我将索引添加到生产环境中,它使页面加载时间回到了大约 100 毫秒。我还是不太明白发生了什么;也许有一天当我学习一些看似与数据库和 SQL 无关的东西时,它会点击一下。
【问题讨论】:
-
如果没有其他原因,我希望您的测试环境性能更好,因为更少的行意味着数据库服务器的工作更少。
-
突然的变化可能是因为查询优化器在某个时候选择使用新的执行计划。可能由于大小/行数,突然旧计划不再可行,查询优化器不得不选择新策略。
-
@KirkWoll:我更新了问题,指出测试环境的数据与生产环境相同,外加少量测试数据。
标签: asp.net sql-server performance asp.net-2.0