如何分析一些从 ASP.NET 应用程序运行的查询?由于数据库的原因,我工作的一些软件运行速度非常慢(我认为)。这些表有索引,但它仍然拖累,因为它正在处理大量数据。我如何配置文件以查看我可以在哪里进行一些小的改进,从而有望带来更大的速度改进?
编辑:我想补充一点,网络服务器喜欢在这些长查询期间超时。
如何分析一些从 ASP.NET 应用程序运行的查询?由于数据库的原因,我工作的一些软件运行速度非常慢(我认为)。这些表有索引,但它仍然拖累,因为它正在处理大量数据。我如何配置文件以查看我可以在哪里进行一些小的改进,从而有望带来更大的速度改进?
编辑:我想补充一点,网络服务器喜欢在这些长查询期间超时。
Sql Server 有一些出色的工具可以帮助您解决这种情况。这些工具内置于 Management Studio(以前称为 Enterprise Manager + Query Analyzer)中。
使用 SQL Profiler 向您展示来自 Web 应用程序的实际查询。
复制每个问题查询(占用大量 CPU 时间或 IO 的查询)。使用“显示实际执行计划”运行查询。希望您会看到一些明显缺失的索引。
您还可以运行调优向导(按钮就在“显示实际执行计划”旁边。它将运行查询并提出建议。
通常,如果您已经有索引并且查询仍然运行缓慢,您将需要以不同的方式重新编写查询。
将所有查询保存在存储过程中会使这项工作变得更加容易。
要分析 SQL Server,请使用SQL Profiler。
您可以使用Red Gate 的ANTS Profiler来分析您的代码。
另一个与 ASP.NET 配合得很好的 .NET 分析器是dotTrace。我亲自使用过它,并在我的代码中发现了很多瓶颈。
我相信您有分析查询所需的答案。但是,这是性能调优中最简单的部分。一旦您知道是查询而不是网络或应用程序,您如何找到并解决问题?
性能调优是一件复杂的事情。但是有一些地方可以先看看。你说你要返回大量数据?您返回的数据是否超出了您的需要?你真的只返回你需要的列和记录吗?使用 select * 返回 100 列可能比返回您实际使用的 5 列慢得多。
您的索引和统计数据是最新的吗?如果您有一段时间没有这样做,请查看如何在 BOL 中更新统计信息和重新索引。您对所有连接字段都有索引吗?where 子句中的字段怎么样。
你用过游标吗?你用过子查询吗?union 怎么样——如果你用的话可以改成 union all 吗?
您的查询是否可搜索(如果不熟悉该术语,请使用 Google 搜索。)
当您可以使用 group by 时,您使用 distinct 吗?
你拿锁了吗?
还有很多其他的东西要看这些只是一个起点。
如果有我想要调整的特定查询或存储过程,我发现在查询之前打开统计信息非常有用:
SET STATISTICS TIME ON
SET STATISTICS IO ON
在查询分析器中打开统计信息时,统计信息将显示在结果窗格的消息选项卡中。
IO 统计数据对我特别有用,因为它让我知道我是否需要索引。如果我从 IO 统计信息中看到高读取计数,我可能会尝试向受影响的表添加不同的索引。当我尝试索引时,我再次运行查询以查看读取计数是否下降。经过几次迭代后,我通常可以为所涉及的表找到最佳索引。
以下是这些统计命令的 MSDN 链接: