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