可能重复:
如何提供一个API客户端包含1,000,000个数据库的结果吗?
使用的想知道游标是贯彻落实“分页”使用PostgreSQL的好方法。
用例是我们有向上100,000行,我们想提供给我们的API客户机。 我们想到了一个好办法做到这一点是允许客户端请求分批(页)的信息。 客户可以一次申请100行。 我们将返回100行以及光标,然后当客户准备好了,他们可以使用我们发送给他们光标请求下一个100行。
不过,我对游标是如何工作的一点点朦胧而究竟如何以及何时应该使用游标:
- 不要光标需要一个数据库连接处于打开状态?
- 做一个事务中运行光标,锁定资源,直到他们是“关闭”?
- 是否还有其他“陷阱”,我是不知道的?
- 是否有其他更好的方法,这种情况应该如何处理?
非常感谢!
游标是在处理大型数据集工作更小的Intranet应用程序分页一个合理的选择,但你必须做好准备在超时后丢弃它们。 用户喜欢神游物外,去吃午饭,去度假两个星期,等,并留下他们的应用程序运行。 如果它是一个基于Web的应用程序,甚至还有的问题是什么“跑”是如何告诉用户是否仍然存在。
他们不适合与来来去去附近随机喜欢在基于Web的应用程序或Web的API客户端高计数和客户大规模应用。 我不建议使用在应用程序中的游标,除非你有一个相当小的客户端数量和极高请求率......在这种情况下,发送行的微小批次将是非常低效的,你应该改为考虑允许范围,要求等。
游标有几个成本。 如果光标不是WITH HOLD
必须保持打开事务。 打开的事务可以防止自动清理从做正确的工作,会引起表膨胀等问题。 如果游标声明WITH HOLD
,交易不保持打开,你必须支付物化和存储潜在的大量结果集的成本-至少,我认为这是如何HOLD游标工作。 另一种方法是一样难受,保持交易隐含开放,直到光标被销毁,防止被清理行。
此外,如果你使用的游标不能用手连接回连接池。 你需要每个客户端一个连接。 这意味着更多的后端资源的使用只是保持会话状态,并设置上,你可以用一个基于光标的方法处理客户端的数量非常现实的上限。
还有的复杂性和管理状态,基于游标的设置相比于限制和偏移一个无状态的连接池方法,因为开销。 你需要让你的应用程序过期光标在超时后或你所面临的服务器上潜在的无限资源的使用,你需要跟踪它的连接具有游标的结果集为哪些用户....
在一般情况下,尽管事实上,它可以是相当低效的, LIMIT
和OFFSET
可以更好的解决方案。 它往往是更好的搜索主键,而不是使用OFFSET
,虽然 。
顺便说一句,你在看在PL / pgSQL的游标的文档。 你想正常的SQL级的游标这项工作。
不要光标需要一个数据库连接处于打开状态?
是。
做一个事务中运行光标,锁定资源,直到他们是“关闭”?
是的,除非他们是WITH HOLD
,在这种情况下,它们消耗其他的数据库资源。
是否还有其他“陷阱”,我是不知道的?
是的,正如上面应该解释。
对于HTTP客户端,不使用游标来实现分页。 对于可扩展性,你不想请求之间捆绑的服务器资源。
相反,使用LIMIT和OFFSET您的查询; 看到LIMIT
和OFFSET
在PG文档 。
但是要确保你的表索引将支持这种形式的有效的查询。
设计一个RESTful API,以便客户端可以调用“next_url”(在响应也通过),以获得下一组行。