性能问题将大型数据集加载到c#GridView中

好,

我一直在测试相对较小的数据集到我的GridView中,并且一切正常。 但是,我现在已经进入适当的UAT,并试图将17,000条记录加载到我的网格中,这基本上使我的网络应用程序停止了。

基本上,用户登录,并在validation时加载所有数据网格,其中一个包含17k记录。 在所有内容加载之前,最终用户都会在登录页面上处理。 所以我需要解决它。

网格的代码是:

DataTable dtValueDateCurrency = null; SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Reporting"].ConnectionString); using (conn) { conn.Open(); //Load all other grid data using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(TSQL1, conn)) { dtValueDateSummary = new DataTable(); sqlAdapter.Fill(dtValueDateSummary); grdValueDateSummary.DataSource = dtValueDateSummary; grdValueDateSummary.DataBind(); } } 

有没有办法增加加载时间? 分页不是一种选择,因为我正在用JQuery来处理这个问题。

在一个查询中加载17,000条记录就是在扼杀你。 我强烈建议分页你的gridview。

首先,您需要更改存储过程,如下所示。

 ALTER PROCEDURE [dbo].[SomeTable_GetPagedResults] ( @StartRowIndex int, @MaximumRows int ) AS SET NOCOUNT ON Select RowNum, [ID], [foo], [bar] From (Select [ID], [foo], [bar], Row_Number() Over(Order By [ID] Desc) As RowNum From dbo.[SomeTable] t) As DerivedTableName Where RowNum Between @StartRowIndex And (@StartRowIndex + @MaximumRows) 

现在您有一个可分页的查询。

您还需要一个查询来获取完整的行数。

 ALTER PROCEDURE [dbo].[SomeTable_GetRowCount] AS SET NOCOUNT ON return (Select Count(ID) As TotalRecords From SomeTable) 

每次更改页面时都会绑定网格。

 protected void gridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { gridView1.PageIndex = e.NewPageIndex; BindGrid(); // this is whatever method you call to bind your data and execute your stored procedure. } 

并且BindGrid()方法将调用您的两个存储过程(一个用于获取完整的行计数,另一个用于获取与当前页面相关的结果)

补充阅读

您需要建立数据库分页。

这将涉及创建自定义排序,自定义过滤和自定义分页,但它将显着提高代码的性能,因为您将从数据库中一次只检索一页数据,而不是全部17,000行一次。

我在银行应用程序中实现了这一function,该应用程序旨在显示,排序和过滤数十万笔贷款。 答案太复杂了,不能给出一个简单的例子,但首先要研究数据库分页。 使用LINQ,它将为您提供简单的TakeSkip方法来实现最简单的分页。

您应该考虑在Web服务器上缓存查询,尤其是在不经常更新的情况下。 这样,所有客户端都可以简单地浏览缓存而不是无情地访问数据库。

看到这个问题

实际上,加载17k记录一次是没用的,即使用户不能一次看到整个17k记录。 我建议你使用分页和DataTable.Merge函数,它有助于以块的forms加载记录并将新获取的数据附加到前一个。 我刚做了一个快速测试并找到了解决方案。 试一试。