我有一个可以运行几分钟并返回几百万条记录的TSQL存储过程,我需要在ASP.NET网格中显示该数据(确切地说是Infragistics WebDataGrid)。显然我不希望一次返回所有数据并且需要设置某种分页选项 - 每次用户选择另一页时 - 从DB加载另一部分数据。但是每次请求新页面时我都无法运行SP - 这将花费太多时间。
从SP保存数据的最佳方法是什么,因此当用户选择新页面时,新数据部分将由该临时数据存储中的简单SELECT ... WHERE加载?
答案 0 :(得分:1)
您是否看过Server Side Paging(文章是2005年,但将与2008年和CTE合作)。另外 - 只是想知道,有没有理由你回来那么多行?即使页面大小为1000,我也看不到很好地使用了一百万条记录的人工分页。
答案 1 :(得分:1)
一些选项
一: 如果用户只向前翻页,那么您可以打开连接并使用DataReader。只需.Read()根据需要。
二: 使用userID作为名称的一部分创建#temp表以存储结果。我不喜欢这样,好像用户有时会中止表格。大约1/2秒击中创建并放弃#temp。存储整个结果或仅存储PK并按需创建页面详细信息。
三: 使用DataReader将PK读入List<&gt ;.它比你想象的要快。该列表仅发送到IIS(而不是浏览器)。列表可以由ordinal []引用并保留排序。根据需要获取页面的详细信息。这里的问题是(3,9,2,6)中的PK不会按顺序返回它们。我使用TVP传递订单,PK所以页面按顺序排序。我正是这样做并且为具有20个属性的对象的页面加载一次40行,并且它花费不到1/2秒。每个表执行一次查询(每行不一个),然后在.NET中汇编赋值属性。使用DataReader(不是DataTable)。你甚至可以在背景工作者上运行阅读器并使用progresschanged传回PK的第一页。