Tsql 临时保存长期运行的SP的结果的最佳方法是什么?

Tsql 临时保存长期运行的SP的结果的最佳方法是什么?,tsql,time,Tsql,Time,我有一个TSQL存储过程,它可以运行几分钟并返回几百万条记录,准确地说,我需要在ASP.NET网格Infrastics WebDataGrid中显示这些数据。显然,我不想一次返回所有数据,需要设置某种分页选项—每次用户选择另一个页面—从数据库加载另一部分数据。但我无法在每次请求新页面时都运行SP—这将花费太多时间 从SP保存数据的最佳方式是什么,这样当用户选择新页面时,新的数据部分将通过简单的选择加载。。。临时数据存储从何处来?您是否看过文章is 2005,但将与2008和CTEs一起使用。另外

我有一个TSQL存储过程,它可以运行几分钟并返回几百万条记录,准确地说,我需要在ASP.NET网格Infrastics WebDataGrid中显示这些数据。显然,我不想一次返回所有数据,需要设置某种分页选项—每次用户选择另一个页面—从数据库加载另一部分数据。但我无法在每次请求新页面时都运行SP—这将花费太多时间

从SP保存数据的最佳方式是什么,这样当用户选择新页面时,新的数据部分将通过简单的选择加载。。。临时数据存储从何处来?

您是否看过文章is 2005,但将与2008和CTEs一起使用。另外,我只是想知道,有什么理由返回这么多行吗?即使页面大小为1000,我也看不到人工分页在一百万条记录中的良好用途。

有几个选项

一: 如果用户只向前翻页,那么您可以保持连接打开并使用DataReader。只要。根据需要阅读

二: 使用用户名作为名称的一部分创建临时表以存储结果。我不喜欢这样,好像用户中止有时会留下一些表。点击约1/2秒可创建并删除临时值。存储整个结果或仅存储PK,并根据需要创建页面详细信息

三:
使用数据读取器将PK读入列表。这比你想象的要快。该列表只会发送到IIS,不会发送到浏览器。列表可由序号[]引用并保留排序。根据需要获取页面的详细信息。这里的问题是,3,9,2,6中的PK不会按该顺序返回它们。我使用TVP传递订单,因此页面按订单排序。我正是这样做的,每次为20个属性40行的对象加载页面,所需时间不到1/2秒。对每个表执行一个查询,而不是对每行执行一个查询,然后在.NET中组装并分配属性。使用DataReader而不是DataTable。您甚至可以在backgroundworker上运行reader,并使用progresschanged传回PKs的第一页

这可能是一个愚蠢的问题,但是,服务器端分页在过滤和排序之前不会仍然检索所有记录吗?或者我只是说了些愚蠢的话?我问它是因为我正在读这篇关于sqlservercentral偏移量的文章谢谢你的及时回复,我打算使用类似的方法,但为了让它工作,我需要SP的结果在所有这些选择的某种临时表中。。。从网页制作到工作。我需要临时存储足够持久,以便数据在不同的分页调用之间(可能在通过ASP.NET代码与SQL server建立的新连接之间)保持在那里,但足够不稳定,因此如果用户简单地关闭页面,数据不会永远保持在那里,而是会被优雅地删除。至于为什么需要提前这么多记录-很可能用户不会直接翻页浏览初始数据集,但会对数据进行额外分组和筛选,但这需要快速进行,因此筛选/分组应在SP返回的结果集上进行,与分页类似,我无法在每次请求分组/筛选时调用SP。要使3处理SP的结果,后端中的实际数据必须存储在某个位置?我应该把它存放在哪里?谢谢使用DataReader将PK读入列表;然后通过TVP Table Value参数将PK列表的一次一页传递给SP。我将发布一些代码。这是我使用的文章。如果我的列表PK可能有600000行,我一次只能通过TVP通过40来获得详细信息,我将订单和PK都传递给TVP,这样我就可以以正确的顺序获得40行的结果。非常好的文章,感谢链接!我将调查这种方法。尽管有些用户仍然使用SQL Server 2005,但我可能会找到一种代替TVP的有效方法,将PK列表传递给SP。我相信,只使用事先已知的PK而不是原始参数SP会运行得更快。但如果不是-我的原始问题仍然存在,我需要将长期运行的SP的resultset临时存储在某个完整的数据集,而不仅仅是PKs,以便连续调用可以快速检索数据(例如使用PKs)。为什么需要存储完整的数据?如果需要存储完整的数据,则需要两个:Temp表。如果非关键数据在查看详细信息和运行SP之间发生变化,您需要他们查看SP运行时的数据快照,而不是当前数据?