从数据库中检索大量数据的游标的替代方法是什么?

时间:2010-11-30 09:05:26

标签: database postgresql

通过stackoverflow搜索我发现了大量的答案,谴责在数据库编程中使用游标。但是我真的不明白替代方案是什么。

出于性能原因,我正在创建一个程序,该程序从数据库中读取大量行(数十万)并将它们保存在内存中。我不能真正运行SELECT * FROM表并立即处理所有结果,是吗?

我找到的最好的方法是使用游标并以增量检索行,例如每次10行。

有人可以开导我吗?我在linux上使用PostgreSQL 9。

由于

6 个答案:

答案 0 :(得分:1)

当您需要处理大量数据时,CURSOR是最佳选择。您也可以使用LIMIT .. OFFSET ..方法,但这会变得越来越慢,具体取决于数据量。 PostgreSQL对游标没有任何问题,在处理大量数据时使用它们。

SQL Server有游标问题,MySQL无法处理存储函数之外的游标,这可能是某些dba不喜欢游标的原因。

答案 1 :(得分:1)

您可以使用记录直接使用for循环:

do
$$
declare r record;

begin

    for r in select product_id, name from products loop
        raise notice '% %', r.product_id, r.jname;
    end loop;

end$$

答案 2 :(得分:1)

我认为最好的方法是使用COPY直接将所需数据提供给客户端应用程序。

使用游标时我也没有任何问题。据我所知,光标正在为您保留数据的快照,正式它(和COPY)是浏览结果的唯一正确方法,否则当使用LIMIT..OFFSET时可能导致不一致,因为新插入的记录改变了偏移量。

答案 3 :(得分:0)

答案 4 :(得分:0)

应该很少需要光标。也许如果你的逻辑随着每一行的更新而改变,那么你可能需要一个游标。

你真的需要为你的问题打开光标吗?你能详细说明你想做什么吗?大数据集是避免游标的一个很好的理由,而不是使用游标的理由。

您应该尝试进行基于集合的处理。只需定期更新表,连接和过滤器。

简单更新可以替换光标循环吗?

答案 5 :(得分:0)

如果您只是下载数据,为什么不使用select?你不是通过一次拉10行来保存任何内存,因为无论如何你都在内存中缓存它。

我错过了什么吗?