将telerik radgrid与自定义分页绑定时存储900000条记录的最佳方法

时间:2011-10-10 15:07:11

标签: asp.net sharepoint-2010 sharepoint-2007

我在sharepoint 2010中创建示例应用程序,我想在telerik radgrid中加载900000条记录,所以首先我将所有900000条记录存储在viewstate中,并从viewstate获取50条记录,并由于性能问题将其绑定在radgrid中,但是页面大小变得非常大,所以它抛出页面超时错误,之后我将900000记录存储在SPWeb属性包而不是存储在viewstate中,尽管它抛出相同的错误,任何人都可以帮助我。  我可以存储那些(900000)值而没有任何超时问题或性能问题,请帮助我

2 个答案:

答案 0 :(得分:0)

您不希望在viewstate中存储900,000条记录。这是对客户端和服务器资源的可怕浪费。而且,如果您的目标是自定义分页解决方案,则没有理由在客户端存储所有信息。呸!

考虑阅读像Efficiently Paging Through Large Amounts of Data这样的文章。有点陈旧,但基本概念是合理的。查看您的查询,了解概念非常重要。

答案 1 :(得分:0)

ViewState不是数据的神奇垃圾填埋场。它旨在保存控件的状态信息,就是这样。在某些情况下,人们将其用于其他事情,但它永远不应该用于存储大量数据。

至于你的问题,你需要实现某种类型的搜索或过滤系统来减少你的结果。不应该有任何需要从数据库中检索近1,000,000个结果的场景。

如果无法实现搜索,则使用分页并将行边界传递给存储过程,因此它仅返回当前页面的结果。

以下是如何使用分页将结果限制为一页的快速示例:

CREATE PROCEDURE dbo.GetProductsPaged ( 
    @startRowIndex int, 
    @maximumRows int 
) AS

SELECT PriceRank, ProductName, UnitPrice 
FROM (SELECT ProductName, UnitPrice, ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank FROM Products ) AS ProductsWithRowNumber 
WHERE RowRank > @startRowIndex AND RowRank <= (@startRowIndex + @maximumRows)

这里有一篇文章可以参考上面的帮助:
http://www.asp.net/data-access/tutorials/efficiently-paging-through-large-amounts-of-data-vb

修改

听起来这个信息在任何方面都不是用户特定的,所以你也可以考虑缓存数据,如下所示:

DataTable table = new DataTable("LotsOfData");

if (Cache.Get("MyData") == null) 
{ 
    //retrieve the data from the database
    table = GetLotsOfData();         

    //store the data in cache
    Cache.Insert("MyData", table); //store the data in cache
} 
else 
{ 
    //get the data from cache
    table = (DataTable)Cache.Get("MenuData"); 
}