postgres가 재귀 쿼리를 실행하면 임시 테이블이 만들어집니다. 쿼리가 완료된 후 전체 프로그램이 경쟁 할 때까지 임시 테이블이 디스크에 남아 있습니다.django/psycopg2에서 postgres 임시 테이블을 정리하는 방법
이 프로그램은 주 프로세스와 다중 처리 풀 작업자로 구성되어 있으며 모두 별도의 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;
쿼리 기능은 다음과 같습니다
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'는 임시 파일을 만들 것입니까? @ 크레이그 링거? –