0

我遇到了一个我以前从未见过的相当独特的问题。

客户有一个应用服务器和一个数据库服务器。应用程序服务器(win 2008)运行 ASP.NET MVC 3 应用程序。数据库服务器(也称为 Win 2008)运行 SQL Server 2008。

每当向数据库发出请求时,w3wp.exe 的 CPU 会上升到 50 - 80 %,网络流量会达到 2%(10 Gbps)。这需要一分钟左右的时间,然后显示请求的网页。

我检查了实际的 Linq 执行时间,只需要几毫秒即可获取数据。

我希望这里的一些专业人士可以对正在发生的事情有所了解。当然,它适用于我的机器。

更新

即使是从 SQL Server Management Studio(在应用程序服务器上)执行的检索 828 行的查询也需要整整 12 秒才能完成......所以我猜问题不是应用程序,而是数据库服务器或连接上的某个地方

更新 2 这是我发现的一些有趣的事情。

这是慢代码:

MyAppDataContext DataContext = MyAppDataContext.CreateNewContext();
IEnumerable<Requests> Entities = DataContext.Requests;

using (profiler.Step("get data")) {
    IEnumerable<Requests> dataset = from x in Entities
                                    where x.ControleStatus == 4
                                    orderby x.ID
                                    select x;
}

但是当我将 IEnumerable 更改为 IQueryable 时,代码的执行速度提高了 10 倍:

MyAppDataContext DataContext = MyAppDataContext.CreateNewContext();
IQueryable<Requests> Entities = DataContext.Requests.AsQueryable();

using (profiler.Step("get data")) {
    IQueryable<Requests> dataset = from x in Entities
                                   where x.ControleStatus == 4
                                   orderby x.ID
                                   select x;
}

所以我的问题是:是什么导致了 IEnumerable 和 IQueryable 之间的巨大差异?

4

1 回答 1

0

Whenever a request to the database is made, CPU for w3wp.exe goes up to 50 - 80 % and network traffic reaches 2% (of 10 Gbps).

  1. Are you taking care of Memory leaks?
  2. Using statements are included in the Database Interaction classes?
  3. I use Red Gate ANTS Memory Profiler to check for the Memory Management Issues.
  4. You are looking for SQL Profiler that tells Reads and Duration.
于 2012-06-13T15:59:30.660 回答