我有一个TSQL存储过程,它可以运行几分钟并返回几百万条记录,我需要在ASP.NET网格(准确地说是WebDataGrid )中显示这些数据。显然,我不想一次返回所有数据,并且需要设置某种分页选项-每次用户选择另一个页面时-从数据库加载另一部分数据。但我不能在每次请求新页面时都运行SP -这会花费太多时间。
什么是最好的方式来持久化数据从SP,以便当用户选择一个新的页面-新的数据部分将加载一个简单的SELECT...临时数据存储在哪里?
发布于 2012-03-13 06:36:37
几个选项
第一:如果用户只向前翻页,那么您只需保持连接打开并使用DataReader即可。根据需要只使用.Read()。
第二:使用userID作为存储结果的名称的一部分,创建一个#temp表。我不喜欢这种情况,因为有时用户中止时会留下表。大约1/2秒的命中率来创建和删除#temp。存储整个结果或仅存储PK,并按需创建页面详细信息。
第三:使用DataReader将PK读取到List<>中。它比你想象的要快。该列表仅发送到IIS (不发送到浏览器)。列表可以通过序号[]引用,并保留排序。根据需要获取页面的详细信息。这里的问题是(3,9,2,6)中的PK不会按该顺序返回它们。我使用TVP来传递订单,PK,因此页面是按顺序排序的。我正是这样做的,每次加载具有20个属性的对象的页面,每次40行,所需时间不到1/2秒。对每个表执行一次查询(而不是每行一个),然后在.NET中汇编、分配属性。使用DataReader (而不是DataTable)。您甚至可以在后台工作人员上运行阅读器,并使用progresschanged传回PKs的第一页。
发布于 2012-03-13 04:36:34
你有没有看过Server Side Paging (文章是2005年的,但可以使用2008和CTE)。还有--只是想知道,有什么原因要返回这么多行吗?即使页面大小是1000,我也不能很好地使用人工对一百万条记录进行分页。
https://stackoverflow.com/questions/9674354
复制相似问题