Ха. Век живи, век учись.
Я вообще помнил это почему-то иначе: указанное количество work_mem выделяется под каждую сортировку/хеширование/whatever, а всё, что в этот размер не влезло, пишется дальше на диск. Если есть условный запрос, который хочет 900М под какой-то sort, то можно, конечно, выставить work_mem в 1G, чтобы оно в память влезало. Но тогда автоматом каждая фигня в запросе, требующая work_mem, будет аллокацию целого гигабайта наперёд делать, даже если ей и мегабайта за глаза. В итоге пять мелких копеечных сортировок в запросе => 5 гигов под него отщипнуло.
Полез я перечитывать походу, в упор не помню про выделение ме́ньших кусков.
Не будет аллокации наперед гигабайта. Будет выделено сколько надо. Этот параметр для планировщика. Если видит что влезет работа в work_mem выделит сколько надо. Не влезет, сразу в диск пойдёт. Обратно эта память не отдается, только с закрытием сессии