SQL Server和/或ASP.NET的性能分析

4

如何对从ASP.NET应用程序运行的一些查询进行分析?我在工作中使用的某个软件由于数据库(我认为)而运行非常缓慢。虽然表有索引,但仍然很慢,因为它正在处理大量数据。我该如何进行分析,以查看在哪里可以进行一些小的改进,希望能带来更大的速度改进?

编辑:我想补充说明的是,在这些长时间查询期间,Web服务器会超时。


我想补充一下,这些长查询期间,Web服务器容易超时。 - Joe Phillips
5个回答

5

Sql Server拥有一些优秀的工具来帮助您解决这种情况。这些工具内置于Management Studio中(曾经被称为Enterprise Manager+Query Analyzer)。

使用SQL Profiler来显示来自Web应用程序的实际查询。

复制每个问题查询(那些消耗大量CPU时间或IO的查询)。使用“展示实际执行计划”运行这些查询。希望您能看到一些明显缺失的索引。

您还可以运行调整向导(该按钮位于“显示实际执行计划”旁边),它会运行查询并给出建议。

通常,如果您已经有了索引并且查询仍然运行缓慢,那么您需要以不同的方式重新编写查询。

将所有查询保留在存储过程中可以使这项工作更加容易。


4

有没有一种方法可以在不是管理员的情况下使用它? - Joe Phillips
您实际上可以使用最新版本的ANTS Profiler来跟踪SQL和I/O使用情况。 - Mel Harbour

3

另一个与ASP.NET兼容的.NET分析器是dotTrace。我个人使用过它,并在我的代码中发现了许多瓶颈。


2
我相信你已经得到了你需要分析查询的答案。然而,这只是性能调整中最简单的部分。一旦你知道不是网络或应用程序的问题,而是查询的问题,那么你如何找到和解决问题呢?
性能调整是一个复杂的过程。但是有一些地方首先需要检查。你说你返回了大量的数据?你返回的数据比你需要的多吗?你真的只返回了你需要的列和记录吗?使用select * 返回100列可能比只返回实际使用的5列要慢得多。
你的索引和统计信息是否更新?如果你很久没有更新,请在BOL中查找如何更新统计信息和重新索引。你所有连接字段都有索引吗?where子句中的字段呢?
你使用了游标吗?你使用了子查询吗?union-if你正在使用它,可以改为union all吗?
你的查询是否可搜索(如果不熟悉该术语,请谷歌)?
你是否在使用distinct时可以使用group by代替?
你是否遇到锁定?
还有许多其他需要注意的事项,这些只是一个起点。

1
如果我想要优化特定的查询或存储过程,我发现在执行查询之前开启统计信息非常有用:
SET STATISTICS TIME ON
SET STATISTICS IO ON

当您在查询分析器中打开统计信息时,统计信息将显示在结果窗格的消息选项卡中。

IO 统计信息对我来说特别有用,因为它让我知道是否需要索引。如果从 IO 统计信息中看到高读取计数,我可能会尝试向受影响的表添加不同的索引。在尝试索引后,我再次运行查询以查看读取计数是否下降。经过几次迭代,我通常可以找到涉及表的最佳索引。

以下是这些统计命令的 MSDN 链接:

SET STATISTICS TIME

SET STATISTICS IO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接