编辑:我认为这是对的LINQ生成的查询子查询的一个问题,它让所有的记录...但我不知道我怎么能解决这个问题

我做了一个简单的ASP.NET MVC 2应用程序,它确实在视图中选择查询,我得到的表现真的很差,虽然做用JMeter一个简单的基准(10个conccurents连接),而禁用缓存(我不一切都要依靠非定制/极端的OutputCache)

我看到SQL服务器超载,消耗CPU的(高达100%),很多及其所有保留的存储器空间(512MB)

下面是动作代码,原因的问题(因为它手动事务导致死锁与其他程序插入在数据库上的新数据):

public ActionResult Index(int page = 0)
{
    IronViperEntities db = new IronViperEntities();
    db.Connection.Open();
    DbTransaction transaction = db.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    var messages = (from globalView in db.GlobalViews orderby globalView.MessagePostDate descending select globalView).Skip(page*perPage).Take(perPage);
    transaction.Commit();
    db.Connection.Close();
    ViewData["page"] = page;
    ViewData["messages"] = messages;
    return View();
}

下面是在数据库上执行查询:

SELECT TOP (100) 
[Extent1].[MessageId] AS [MessageId], 
[Extent1].[MessageUuid] AS [MessageUuid], 
[Extent1].[MessageData] AS [MessageData], 
[Extent1].[MessagePostDate] AS [MessagePostDate], 
[Extent1].[ChannelName] AS [ChannelName], 
[Extent1].[UserName] AS [UserName], 
[Extent1].[UserUuid] AS [UserUuid], 
[Extent1].[ChannelUuid] AS [ChannelUuid]
FROM ( SELECT [Extent1].[MessageId] AS [MessageId], [Extent1].[MessageUuid] AS [MessageUuid], [Extent1].[MessageData] AS [MessageData], [Extent1].[MessagePostDate] AS [MessagePostDate], [Extent1].[ChannelName] AS [ChannelName], [Extent1].[UserName] AS [UserName], [Extent1].[UserUuid] AS [UserUuid], [Extent1].[ChannelUuid] AS [ChannelUuid], row_number() OVER (ORDER BY [Extent1].[MessagePostDate] DESC) AS [row_number]
    FROM (SELECT 
      [GlobalView].[MessageId] AS [MessageId], 
      [GlobalView].[MessageUuid] AS [MessageUuid], 
      [GlobalView].[MessageData] AS [MessageData], 
      [GlobalView].[MessagePostDate] AS [MessagePostDate], 
      [GlobalView].[ChannelName] AS [ChannelName], 
      [GlobalView].[UserName] AS [UserName], 
      [GlobalView].[UserUuid] AS [UserUuid], 
      [GlobalView].[ChannelUuid] AS [ChannelUuid]
      FROM [dbo].[GlobalView] AS [GlobalView]) AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 0
ORDER BY [Extent1].[MessagePostDate] DESC

查看代码:

SELECT     dbo.Messages.Id AS MessageId, dbo.Messages.Uuid AS MessageUuid, dbo.Messages.Data AS MessageData, dbo.Messages.PostDate AS MessagePostDate, 
                      dbo.Channels.Name AS ChannelName, dbo.Users.Name AS UserName, dbo.Users.Uuid AS UserUuid, dbo.Channels.Uuid AS ChannelUuid
FROM         dbo.Messages INNER JOIN
                      dbo.Users ON dbo.Messages.UserId = dbo.Users.Id INNER JOIN
                      dbo.Channels ON dbo.Messages.ChannelId = dbo.Channels.Id

我不认为服务器硬件出了问题,我可以运行Rails的等效/ Grails应用程序没有任何性能问题。 (双核,3GB的RAM)

一个SELECT COUNT(*)上GlobalView的返回〜270.000线,索引重建每日和解释显示它使用的所有聚簇索引。

我得到8000MS的HTTP平均响应时间,SQL Server Management Studio中示出的平均CPU时间866ms的这个SQL查询和7,592.03平均逻辑IO

数据库的文件大小是否〜180MB

我使用的Windows Server 2008 R2企业版,ASP.NET MVC 2与IIS 7.5和SQL Server 2008 R2 Express Edition与高级服务。他们是这台服务器上运行的唯一的东西。

我该怎么办?

感谢您

有帮助吗?

解决方案 3

我发现probleme,

我改为“排序依据globalView.MessagePostDate降”的“排序依据globalView.MessageId降”,因为没有在任何MessagePostDate指标,那就是muuuuch更好!

感谢您

其他提示

我猜你有从SQL Server Profiler中查询。保存结果,并把它传递到数据库引擎优化顾问。这可能会帮助您创建额外的索引和统计信息。

只是出于好奇:不会追加.ToList()到的var messages = ...在线帮助结束

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top