| From: | Merlin Moncure <mmoncure(at)gmail(dot)com> |
|---|---|
| To: | Matthew Wakeling <matthew(at)flymine(dot)org> |
| Cc: | pgsql-performance(at)postgresql(dot)org |
| Subject: | Re: plpgsql arrays |
| Date: | 2009-04-03 15:09:44 |
| Message-ID: | b42b73150904030809u57e0f259i7d0c428a28b0988d@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-performance |
On Fri, Apr 3, 2009 at 11:02 AM, Merlin Moncure <mmoncure(at)gmail(dot)com> wrote:
> On Fri, Apr 3, 2009 at 9:32 AM, Matthew Wakeling <matthew(at)flymine(dot)org> wrote:
>> genes = '{}';
>> next_new = 1;
>> FOR loc IN SELECT location.* FROM location, gene WHERE location.subjectid =
>> gene.id ORDER BY objectid, intermine_start, intermine_end LOOP
>> genes[next_new] = loc;
>> IF (next_new % 10000 = 0) THEN
>> RAISE NOTICE 'Scanned % gene locations', next_new;
>> END IF;
>> next_new = next_new + 1;
>> END LOOP;
>> genes_size = coalesce(array_upper(genes, 1), 0);
>> RAISE NOTICE 'Scanned % gene locations', genes_size;
>>
>> For 200,000 rows it takes 40 minutes.
>>
>> So, is there a way to dump the results of a query into an array quickly in
>> plpgsql, or alternatively is there a way to read two results streams
>> simultaneously?
>
> try this:
> select array(SELECT location.* FROM location, gene WHERE
> location.subjectid = gene.id ORDER BY objectid, intermine_start,
> intermine_end)) into genes;
one more time:
select array(SELECT location FROM location, gene WHERE
location.subjectid = gene.id ORDER BY objectid, intermine_start,
intermine_end)) into genes;
this will make array of location records. when you access the records
to do the merge, make sure to use () noation:
if (genes[x]).field > something then
...
merlin
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Matthew Wakeling | 2009-04-03 15:15:32 | Re: plpgsql arrays |
| Previous Message | Merlin Moncure | 2009-04-03 15:02:13 | Re: plpgsql arrays |