通过stackoverflow搜索我发现了大量的答案,谴责在数据库编程中使用游标。但是我真的不明白替代方案是什么。
出于性能原因,我正在创建一个程序,该程序从数据库中读取大量行(数十万)并将它们保存在内存中。我不能真正运行SELECT * FROM表并立即处理所有结果,是吗?
我找到的最好的方法是使用游标并以增量检索行,例如每次10行。
有人可以开导我吗?我在linux上使用PostgreSQL 9。
由于
答案 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行来保存任何内存,因为无论如何你都在内存中缓存它。
我错过了什么吗?