【发布时间】:2008-12-09 12:39:51
【问题描述】:
我有一个旧的经典 asp/sql 服务器应用程序,即使负载不是很大,它也会不断抛出 500 个错误/超时。一些数据库查询非常密集,但没有什么会导致它崩溃。
有没有什么好的软件可以安装在我的服务器上,可以准确地显示出瓶颈在 asp 或 DB 中的位置?
【问题讨论】:
我有一个旧的经典 asp/sql 服务器应用程序,即使负载不是很大,它也会不断抛出 500 个错误/超时。一些数据库查询非常密集,但没有什么会导致它崩溃。
有没有什么好的软件可以安装在我的服务器上,可以准确地显示出瓶颈在 asp 或 DB 中的位置?
【问题讨论】:
您可以尝试一些工具:
【讨论】:
超时发生在哪里? ASP 连接/执行 sql 时是否在线?如果是这样,您的问题要么与数据库服务器的连接有关,要么在于数据库本身。在 MSSQL 中加载 SQL 分析器以查看查询需要多长时间。可能是由于数据库中的锁。
您使用交易吗?如果是这样,请确保他们不会长时间锁定您的数据库。确保在 ADO 中而不是在整个 ASP 页上使用事务。您还可以通过对表使用 WITH (NOLOCK) 提示来忽略 SQL 选择中的锁定。
确保您的数据库使用索引进行了优化。
还要确保您在尽可能短的时间内连接到数据库,即(示例代码无效):conn.open;设置 rs = conn.execute(); rs.关闭;康涅狄格关闭。因此,将记录集存储在一个变量中,而不是在保持与数据库的连接打开时循环。一个好的方法是在 ADO 中使用 GetRows() 函数。
始终显式关闭 ADO 对象并将其设置为空。这可能会导致与数据库的连接保持打开状态。
启用连接池。
如果您正在使用它们,请在 global.asa 中加载 ADO 常量
不要在会话或应用程序范围内存储任何对象。
升级到最新版本的 ADO、MDac、SQL Server 服务包等
您确定服务器可以处理负载吗?也许升级它?是在共享主机上吗?也许你的应用不是问题。
通过从第一行到最后一行的时间来衡量脚本性能非常简单。这样您就可以识别运行缓慢的页面。
【讨论】:
您是否尝试过在服务器上运行 SQL Server Profiler?它将突出显示应用程序对数据库的任何意外活动,并帮助识别性能不佳的查询。
【讨论】:
如果您对数据库查询的密集度感到满意,那么您可能需要在使用这些查询的页面上设置更合适的超时时间。
将 Server.ScriptTimeout 设置为更大的值,您可能还需要为脚本使用的 ADO Command 对象设置超时。
【讨论】:
这就是我的处理方式。
查看服务器上正在运行的任务。哪个占用更多 CPU 时间 - SQL 服务器或 IIS?大多数时候,它将是 SQL 服务器,根据您的帖子,它听起来肯定是这样的。很少有 ASP 应用程序实际上在 ASP 端而不是 COM 或 SQL 端进行大量处理。
使用 SQL Profiler 检查访问数据库服务器的所有查询。
首先处理低垂的果实。通常,您会遇到一些“问题”查询,这些查询经常访问数据库并占用大量时间。处理这些。 (软件开发中的一个真理是 10% 的代码会占用 90% 的执行时间......)
除了使用 SQL Profiler 和 Query Analyzer/SQL Studio 查看查询成本以及进行正常的 SQL 性能检测工作之外,您可能还想检查您的数据库调用是否向您的 ASP 代码返回了过多的数据。我见过一些看起来无害的查询向 ASP 返回大量不需要的数据的情况——由懒惰/没有经验的程序员编写的经典(“从表名中选择 *”)类型的查询,当程序员真的只需要 1 时返回 10,000 大行1 行的字段。我之所以提到这种特殊情况,是因为这类查询在 SQL 方面的执行时间和查询成本通常都很低,因此可能会被忽视。
【讨论】: