Когда postgres запускает рекурсивный запрос, он создает временную таблицу для него. После завершения запроса временная таблица остается на диске, пока вся программа не конкурирует.Как очистить postgres временные таблицы рекурсивного запроса от django/psycopg2
Программа состоит из основного процесса и многопроцессорного пула рабочих, все с отдельными соединениями db (и я не могу закрыть соединение основного процесса, поскольку он содержит итерирующий источник данных).
Я хотел бы заставить postgres очистить эти временные таблицы после каждого запроса, потому что огромное количество данных.
Запросы выполняются в следующем виде:
def process_datum(datum):
with db.connections['world'].cursor() as cursor:
cursor.execute("SELECT ... from query_function(%s)", (datum.id,))
rows = cursor.fetchall()
for row in rows:
try:
...
A_Model.objects.create(...)
except db.IntegrityError as e:
logger.warning("%s: %s", path, e)
process_datum
вызывается из рабочих, query_function
является база данных на стороне таблицы функции реализации рекурсивного запроса.
PS Основные запросы:
select ... from features limit 1000 offset xxxx;
функция запроса является:
with recursive recursion(child_id, parent_id, node_id, path) as (
select h.child_id, h.parent_id, h.parent_id as node_id, ARRAY[h.parent_id]
from hierarchy h
where h.direct=true and h.child_id=$1
union all
select h.child_id, h.parent_id, r.node_id, r.path || ARRAY[h.parent_id]
from recursion r join hierarchy h on h.child_id = r.parent_id
where h.direct=true and h.parent_id != r.node_id
)
select * from recursion
Создание запроса, как это:
insert into hierarchy (parent_id, child_id, direct, path) values (%d, %d, false, %s::bigint[])
* Когда postgres запускает рекурсивный запрос, он создает для него временную таблицу *. Нет, нет. Похоже, ваша структура создает временную таблицу и запускает рабочих. Запросы PostgreSQL 'WITH RECURSIVE' делают * не * создавать временные таблицы. –
Временные данные отображаются в /var/lib/postgres/.../base/pgsq_tmp - что еще это может быть? – qMax
Речь идет не о «рекурсивной», а о том, как не использовать память для расчетов. Я не вижу 'ORDER BY', поэтому, вероятно, CTE также создает временные файлы? @CraigRinger? –