【发布时间】:2019-05-28 00:39:12
【问题描述】:
我想知道CURSOR 和FETCH 在PostgreSQL 内部是如何工作的。
一开始我以为
当
CURSOR用select语句声明时,DB 将执行select语句,然后将结果存储在DB 内存中。当在
CURSOR上调用FETCH时,DB 只会读取在CURSOR上移动的结果。当
CURSOR关闭时,存储的结果将从内存中删除。
如果我的假设是正确的,那么无论select 语句有多复杂,FETCH 的响应时间都应该很短。
但是,当我测试时,FETCH 显示的响应时间比我预期的要差,就像它做了一些我没有预料到的事情。
它们是如何工作的?
--------- 编辑 ---------
以下是我使用实际数据库表进行测试时得到的结果。
(select 语句包含 3 个表的 join 子句,其中一个表有 300 万行)
( 8sec) DECLARE “123" NO SCROLL CURSOR WITH HOLD FOR SELECT .....
(0.04sec) FETCH FORWARD 2 FROM "123";
( 4sec) FETCH FORWARD 10000 FROM "123";
--------- 编辑 ---------
FETCH FORWARD 10000 FROM "123" 的 4 秒响应时间似乎是因为我使用了pgcli(PostgreSQL 客户端工具)。
我不知道为什么,但是在更换客户端工具后,它显然快了 0.04 秒。
【问题讨论】:
-
SELECT不会在您声明游标时执行,而是在您第一次使用它时(第一个FETCH)。另见this answer. -
@klin 根据我的测试,
DECLARE似乎有所作为。请检查我编辑的问题。
标签: postgresql cursor