我創建了一個內部網站,使用大量來自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? – jim 2010-11-16 23:00:15
我不知道這是不是一個比ASP.NET MVC問題更多的數據庫問題。值得看看生成的SQL來獲取這些數據,並問「爲什麼這個SQL查詢在我的數據庫上運行得如此之慢?」因爲你有很多行,你可能會遇到SQL Server Express Edition的限制嗎? – MichaC 2010-11-16 23:11:37
你爲什麼要在嚴格的只讀操作中創建一個數據庫事務? – 2010-11-17 00:40:58