=?UTF-8?B?6auY5aKe55Cm?= <pgf...@gmail.com> writes: > Here is the example: > create table t (a int); > insert into t values (1),(3),(5),(7),(9); > insert into t select a+1 from t; > begin; > declare c cursor for select * from t order by a; > fetch 3 in c; > fetch 3 in c; > fetch 3 in c; > > In 'PortalRun', a fetch stmt will be treated with PORTAL_UTIL_SELECT, > and then a tuplestore will be created in 'FillPortalStore' in the > fetch stmt's portal.
How are you trying to do the fetches, PQexec("fetch 3 in c") ? That is an inherently inefficient way to do things, and trying to shave a few cycles off the intermediate tuplestore isn't going to fix that. The general overhead of parsing a new SQL command is probably going to swamp the costs of a tuplestore, especially if it's too small to spill to disk (and if it isn't, you really do need the tuplestore mechanism, slow or not). If you want to get a speed improvement there would probably be a lot more bang for the buck in extending libpq to support protocol-level portal access. It does already have PQdescribePortal, but for some reason not anything for "fetch N rows from portal so-and-so". Not sure whether it's worth providing explicit portal open/close commands separate from PQexec'ing DECLARE CURSOR and CLOSE, but maybe at the margins those steps would be worth improving too. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers