Postgresql SETOF vs Refcursor

时间:2013-08-18 15:55:01

标签: java sql postgresql jdbc

我在Postgresql中有一个基本的用户表,

CREATE TABLE myuser (
userId    bigserial primary key,
user_name varchar(32),
password  varchar(32)
);

我想要一个存储过程来检索这些数据。看看这里的文档:posgresql call proc我看到我基本上有两种不同的选择。

  1. 返回SETOF myuser
  2. 返回带有我想要的数据的refcursor
  3. 我正在使用Java,我想知道哪一个更快,和/或更好。两者之间的功能差异是什么?我看起来唯一的区别是我如何设置我的Java CallableStatement,但为什么我会选择一个而不是另一个呢?

2 个答案:

答案 0 :(得分:4)

游标和记录集之间的主要区别是可以通过游标控制到客户端的数据传输。当您处理应该从服务器移动到客户端的非常大的数据时,游标很有用。没有游标PostgreSQL立即将所有数据推送到客户端内存 - 它很快(总时间,但开始时间与总时间相同,并且可能需要大量内存(对于更大的数据))。使用游标,您可以控制从服务器到客户端可以获取多少行(总时间通常更长,但开始时间可以(不一定是 - 取决于更多因素)低。

-- classic query
SELECT * FROM generate_series(1,100000);
-- 100000 rows is pushed to client at once 
-- less network handshaking, more client memory consumption

-- cursors - more network handshaking, 
-- controlled memory consumption on client side
BEGIN;
DECLARE xx CURSOR FOR SELECT * FROM generate_series(1,1000000);
FETCH 100 FROM xx; -- read 100 rows from server to client
FETCH 100 FROM xx; -- read next 100 rows from server to client
...
COMMIT;

答案 1 :(得分:3)

我不是PostgreSQL的大师,但根据我对SQL的了解,使用套装比使用游标几乎总是更好,所以我要说 - 选择SETOF。

PostgreSQL中也没有存储过程,只有函数。