【发布时间】:2013-12-31 04:30:47
【问题描述】:
我使用 asp.net gridview 少量数据加载到网格不是问题,但大量数据加载到网格我面临缓慢问题。如何避免?
我正在使用 sqldataadapter 并填充到数据表并绑定到 gridview
【问题讨论】:
-
只有一种方法可以避免性能问题:找出耗时过长的问题,然后修复它。您是否确切地确定了代码的哪一部分花费了太长时间?
-
感谢您的建议
我使用 asp.net gridview 少量数据加载到网格不是问题,但大量数据加载到网格我面临缓慢问题。如何避免?
我正在使用 sqldataadapter 并填充到数据表并绑定到 gridview
【问题讨论】:
我在返回大约 9000 行数据源访问存储过程时遇到了这个问题。 sproc 运行得很快,但是当它被数据绑定到 gridview 时会运行得很慢。
我删除了存储过程中的order by 子句,它很快就亮了。显然,网格想要自己排序。
【讨论】:
您将需要执行两个查询,第一个是获取网格视图的所有页面中的记录总数(这是导致数据绑定非常慢的大量数据)。获得此总数后,您需要计算可用于寻呼机控件的总页数。最后,您需要对要从服务器检索的单个数据页面进行查询。
例如,如果您的网格视图总共有 1,000 行 (SELECT COUNT(*) FROM YourTable),并且您希望页面每页显示 25 行,那么您将有 40 页 (1,000 / 25 = 40) 的数据和任何单个请求一页数据只会返回 25 条记录,而不是全部 1000 条记录。
有关实现此逻辑的演练,请阅读Efficiently Paging Through Large Amounts of Data。
更新:
如果你对分页控件不感兴趣,那么你可以实现一个无限滚动类型的界面,当用户向下滚动页面时,从服务器获取下一页数据。阅读Load Content While Scrolling With jQuery了解更多信息。
【讨论】:
UPDATE。
一次显示数千条记录不是一个好主意 - 这可能是性能问题的主要原因。缓解这种情况的一种方法是将数据检索到 DataTable 中,缓存该数据表并在分页中使用它来显示,例如每页 50 条记录。 (这样您就不必为每次页面更改/重新绑定都访问数据库)。
即使这种方法也适用于有限数量的记录,如果该数量变得巨大 - 即使将所有记录检索到内存 DataTable 中也不是一种选择,您将不得不实现服务器端分页以仅检索一部分数据一次来自数据库。
也就是说,当从 .NET 代码调用查询而不是在 SSMS 中直接执行时,另一个常见的减速原因可能是参数嗅探。如果 SQL Server 构建和缓存的执行计划对于当前查询执行不是最佳的 - 它可能真的会减慢它的速度。尝试在构建 SQL 语句的代码末尾添加以下行:
【讨论】:
这需要服务器端分页。这意味着您的 gridview 每页将仅加载 10/15 个条目。当您单击下一页时,它将再次访问您的数据库并带来接下来的 10 条记录。设置需要一点时间,但绝对值得。你会有很好的表现。 Efficiently Paging through large results
【讨论】: