2010-11-16 85 views
0

我創建了一個內部網站,使用大量來自SQL數據庫的數據(現在是1 282 727行(〜800MB),每分鐘增長一次),我使用此代碼(LINQ to entities)來呈現分頁頁面:ASP.NET MVC2 + LINQ-to-Entities分頁的好方法是什麼?

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.MessageId descending select globalView).Skip(page*perPage).Take(perPage); 
     transaction.Commit(); 
     db.Connection.Close(); 
     ViewData["page"] = page; 
     ViewData["messages"] = messages; 
     return View(); 
    } 

一切正常,但它看起來像頁面編號越大,頁面越慢,當我顯示頁面2時,它需要〜700毫秒(90%是來自延遲),當我顯示頁面6354時,它需要4280ms ...

這是正常的嗎?如果沒有,如何解決它?

該網站使用ASP.NET MVC2,Windows Server 2008 R2企業版,SQL Server 2008 R2速成版。

編輯:這裏是LINQ產生的實體SQL查詢的例子:

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].[MessageId] 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] > 656700 
ORDER BY [Extent1].[MessageId] DESC 
+0

您是不是要在方法參數中將頁面設置爲0? – jim 2010-11-16 23:00:15

+3

我不知道這是不是一個比ASP.NET MVC問題更多的數據庫問題。值得看看生成的SQL來獲取這些數據,並問「爲什麼這個SQL查詢在我的數據庫上運行得如此之慢?」因爲你有很多行,你可能會遇到SQL Server Express Edition的限制嗎? – MichaC 2010-11-16 23:11:37

+0

你爲什麼要在嚴格的只讀操作中創建一個數據庫事務? – 2010-11-17 00:40:58

回答

0

你的問題的部分原因是要爲只讀的操作創建一個數據庫事務柯克•沃爾在說你註釋。另一個問題是你爲什麼打開數據庫連接?看起來你正在使用實體框架,這意味着你不需要這些。只需使用Read Only操作填充一個對象,然後調用object.SaveChanges();這會將更改保留回數據庫。例如:

MyProjectEntities db = new MyProjectEntities(); 
Person person = db.People.Where(x => x.Name == "John Doe").First(); 
person.Name = "ChangedObjectData"; 
db.SaveChanges(); 

修改您的操作方法,看起來像這樣並告訴我它是否仍然完成您正在尋找的內容。

public ActionResult Index(int page = 0) 
{ 
    IronViperEntities db = new IronViperEntities(); 
    var messages = (from globalView in db.GlobalViews orderby globalView.MessageId descending select globalView).Skip(page*perPage).Take(perPage); 
    ViewData["page"] = page; 
    ViewData["messages"] = messages; 
    return View(); 
} 
+0

問題是我必須創建事務,因爲還有另一個應用程序(使用RAW SQL)將數據同時存入數據庫,如果我不做交易,我會隨機得到死鎖:( – Kedare 2010-11-17 08:00:32

相關問題