Re: SQL advice needed

Поиск
Список
Период
Сортировка
От Merlin Moncure
Тема Re: SQL advice needed
Дата
Msg-id CAHyXU0wffc5s4dWJJtELbePMb7FGreA+VNiKC_E9tgqH9dMZfg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: SQL advice needed  (Torsten Förtsch <torsten.foertsch@gmx.net>)
Список pgsql-general
On Mon, Mar 17, 2014 at 4:20 PM, Torsten Förtsch
<torsten.foertsch@gmx.net> wrote:
> On 17/03/14 21:42, Merlin Moncure wrote:
>>> I can do it in plpgsql. But that would mean to accumulate the complete
>>> > result in memory first, right? I need to avoid that.
>> I would test that assumption.   This is better handled in loop IMO.
>>
>> LOOP
>>   RETURN QUERY SELECT * FROM xx();
>>   IF NOT found
>>   THEN
>>     RETURN;
>>   END IF;
>> END LOOP;
>
> At least according to the manual it is stored in memory:
>
> <cite>
> Note: The current implementation of RETURN NEXT and RETURN QUERY stores
> the entire result set before returning from the function, as discussed
> above. That means that if a PL/pgSQL function produces a very large
> result set, performance might be poor: data will be written to disk to
> avoid memory exhaustion, but the function itself will not return until
> the entire result set has been generated. A future version of PL/pgSQL
> might allow users to define set-returning functions that do not have
> this limitation. Currently, the point at which data begins being written
> to disk is controlled by the work_mem configuration variable.
> Administrators who have sufficient memory to store larger result sets in
> memory should consider increasing this parameter.
> </cite>
>
> I didn't test that, though.

The manual says describes the exact opposite of what you said you
thought it does -- large result sets are paged out to disk, not stored
in memory (this is a feature).  CTEs use a similar tactic so it's a
wash.  The performance overhead of a tuplestore is probably not as bad
as you think -- just test it out some simulated results and monitor
performance.  Either way, work_mem controls it.  It's generally
dangerous to crank work_mem to huge values but it's ok to set it
temporarily via SET to huge values (say to 1GB) for a query
particularly if you know that it's only getting issued by one caller
at a time.

merlin


В списке pgsql-general по дате отправления:

Предыдущее
От: "Dennis"
Дата:
Сообщение: Re: Dump Database
Следующее
От: Rich Shepard
Дата:
Сообщение: Upgrade: 9.0.5->9.3.3