有没有一种方法可以从长时间运行的SQL Server存储过程中只获取第一页数据



我的最终需求是在Web API页面上显示一些报告(SQL Server存储过程的结果)。

挑战在于,返回这些数据的存储过程非常缓慢,有时需要几分钟才能运行。在他们的右(或左)脑中,没有一个用户会觉得这种看似无休止的延迟是可以接受的,因此我想知道是否有一种方法可以让第一页(比如40或50行数据)作为"奶嘴"呈现给他们,而其余的则在随后的页面上"幕后"呈现。

我知道以这种方式(一次一页)呈现数据是很常见的,但实际上有可能以这种方式"切片"存储过程以加快速度吗?也就是说,不需要更改存储过程本身-只需要从Web API应用程序中的C#(或Javascript)?

我能想到的唯一其他可行的选择(以及是否可行还有待讨论)是将已保存为.xlsx(或.csv)文件的运行前报告存储到服务器,在那里可以从Web API应用程序访问这些报告,并对其进行转换/按摩以显示在页面上。这需要将文件从客户端实用程序发送到服务器计算机(!),并可能在服务器上使用Excel Interop(!)。

这个恶棍的最后一个避难所是向用户显示一张gif图,显示一只跳舞的熊在玩小猫什么的,而存储过程却在缓慢进行。

更新

两个答案都很好,作为一个落后者(失败者的支持者),我选择了得分较少的猫。

受这两只猫的启发,我想我要做的是在创建每个Excel报表时向我的Web API应用程序发送一条"消息",将数据(通过调用同一SP)存储在服务器上的表中。然后,当用户浏览到所提供的链接时,报告数据将对用户可用。当他们实际执行此操作时(通常至少几分钟后),表中已经填充了来自SP的数据,并且页面的后续呈现应该最多几秒钟,而不是几分钟。

我可能会安排一个在后台运行的作业,并将SP的结果存储在一个表中,然后作为一种Cache从web api进行访问。

您可以在sql server中或使用Hangfire 来安排作业

不知道具体使用了什么,也不知道如何呈现存储过程的结果。实际上,我建议定期预运行大型报告,这将在正常时间释放资源,并允许用户"跳过"等待。然而,客户端可能不应该直接访问托管DB的服务器机器,使用必要的安全协议设置FTP服务器可能是服务器和客户端之间自动文件传输的最简单方法。(SSIS具有非常快速和简单的拖放界面,用于设置需要连接到ftp的作业)

您还可以创建一个只返回一小部分结果的重复存储过程,在主过程仍在运行时调用它并呈现它(您可能需要设置某种计时器来检查主过程是否已完成)

最新更新