Yaroslav Schekin
> Если что, то я про pgsql_tmp.
Я тоже. Я имел в виду — ограничить с помощью temp_file_limit, да и всё.
> но тогда мы будем на каждый коннект память выделять, независимо от того нужна она или нет.
Ничего подобного. Work_mem — просто рекомендательное "ограничение", причём на один узел запроса.
Т.е. если запросам в данной сессии столько памяти не нужно — она и не выделяется вообще.
А если требуется больше, т.е. другого выхода нет (я тут как-то приводил примеры) — PostgreSQL попробует выделить сколько нужно, проигнорировав work_mem, кстати.
> Сунуть pgsql_tmp на приемлемый по размеру рамдиск
Мой совет выше — просто чтобы с ram disk не заморачиваться. Хотя таким образом можно ограничить "в общем", минус в непредсказуемых ошибках в запросах в сессиях, когда эта память будет почти исчерпана (т.е. сессии начнут "красть" друг у друга ресурсы). ;)
> такой подход может немало оперативки сэкономить.
Каким образом (по сравнению с тем, чтобы просто ограничить)?
Ха. Век живи, век учись.
Я вообще помнил это почему-то иначе: указанное количество work_mem выделяется под каждую сортировку/хеширование/whatever, а всё, что в этот размер не влезло, пишется дальше на диск. Если есть условный запрос, который хочет 900М под какой-то sort, то можно, конечно, выставить work_mem в 1G, чтобы оно в память влезало. Но тогда автоматом каждая фигня в запросе, требующая work_mem, будет аллокацию целого гигабайта наперёд делать, даже если ей и мегабайта за глаза. В итоге пять мелких копеечных сортировок в запросе => 5 гигов под него отщипнуло.
Полез я перечитывать походу, в упор не помню про выделение ме́ньших кусков.