1

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

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

我想要一个存储过程来检索这些数据。查看此处的文档: posgresql call proc我看到我基本上有 2 个不同的选项。

  1. 返回一个 SETOF myuser
  2. 返回带有我想要的数据的 refcursor

我正在使用 Java,我想知道哪个更快,和/或更好。两者在功能上有什么区别?我看起来唯一的区别是我如何设置我的 Java CallableStatement,但我为什么要选择另一个呢?

4

2 回答 2

4

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

-- 经典查询
SELECT * FROM generate_series(1,100000);
-- 100000 行一次推送到客户端
-- 更少的网络握手,更多的客户端内存消耗

-- 游标 - 更多的网络握手,
-- 控制客户端的内存消耗
开始;
DECLARE xx CURSOR FOR SELECT * FROM generate_series(1,1000000);
从 xx 获取 100;-- 从服务器读取 100 行到客户端
从 xx 获取 100;-- 从服务器读取下 100 行到客户端
...
犯罪;
于 2013-08-19T07:54:42.380 回答
3

我不是 PostgreSQL 专家,但根据我对 SQL 的了解,使用集合几乎总是比使用游标更好,所以我想说 - 使用 SETOF。

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

于 2013-08-18T19:33:25.540 回答