On 05/09/2012 03:36 PM, Joe Conway wrote:
> Good call -- of course that just means my contrived example fails to
> duplicate the real issue :-(
> In the real example, even with work_mem = 1 MB I see the same behavior
> on 9.1.

OK, new script. This more faithfully represents the real life scenario,
and reproduces the issue on HEAD with out-of-the-box config settings,
versus 8.1 which completes the query having never exceeded a very modest
memory usage:

---------------
On pg 8.1 with out of the box config:
VIRT  RES  SHR
199m  11m 3032
---------------
On pg head with out of the box config:
VIRT  RES  SHR
1671m 1.5g  16m
---------------

I have not tried your ulimit suggestion yet but will do that next.

Joe

-- 
Joe Conway
credativ LLC: http://www.credativ.us
Linux, PostgreSQL, and general Open Source
Training, Service, Consulting, & 24x7 Support
CREATE OR REPLACE FUNCTION create_parts ()
RETURNS text AS $_$
DECLARE
    i     int;
    sql   text;
BEGIN
   sql := 'CREATE TABLE foo (
           ts timestamp with time zone,
           d1 bigint, d2 bigint, d3 bigint,
           d4 bigint, d5 bigint, d6 bigint,
           s1 text, s2 text, s3 text,
           s4 text, s5 text, s6 text)';
    EXECUTE sql;
    FOR i IN 1..100 LOOP
      sql := 'CREATE TABLE foo_' || i || ' () INHERITS (foo)';
      EXECUTE sql;
      sql := $$
               INSERT INTO foo_$$ || i || $$ SELECT now(),
               ss.id, ss.id, ss.id, ss.id, ss.id, ss.id, 
               'a'::text, 'bbbbbbbb'::text,
               'cccccccccccccccccc'::text,
               'ddddddddddddddddddddddddddddddddddd'::text,
               'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'::text,
               'fffffffffffffffffffffffffffffffffff'::text
               FROM (SELECT id::bigint FROM generate_series(1,200000) as t(id)) ss
             $$;
      EXECUTE sql;
    END LOOP;
    RETURN 'OK';
END;
$_$ LANGUAGE plpgsql VOLATILE;

SELECT create_parts ();

CREATE OR REPLACE FUNCTION selectDetailed ()
RETURNS setof foo AS $_$
DECLARE
    result_rec                  record;
    sql                         text;
BEGIN
    sql := 'SELECT * FROM foo';
    FOR result_rec IN EXECUTE sql LOOP
        RETURN NEXT result_rec;
    END LOOP;
    RETURN;
END;
$_$ LANGUAGE plpgsql STABLE;

select count(*) from selectDetailed();



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to