2017-01-25 5 views
1

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[]) 
+0

* postgres가 재귀 쿼리를 실행하면 임시 테이블이 만들어집니다. 아니, 그렇지 않아. 프레임 워크가 임시 테이블을 만들고 작업자를 시작하는 것처럼 들립니다. PostgreSQL의'WITH RECURSIVE' 질의는 임시 테이블을 생성하지 않습니다 *. –

+0

임시 데이터는 /var/lib/postgres/.../base/pgsq_tmp에 나타납니다 - 그밖에 무엇이있을 수 있습니까? – qMax

+0

'재귀 적'이 아니라 계산을위한 메모리를 맞추는 것이 아닙니다. 'ORDER BY'가 보이지 않으므로 아마도'CTE'는 임시 파일을 만들 것입니까? @ 크레이그 링거? –

답변

0

문제 때문에 가짜로 무한 재귀에 있었다 :

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 

만들기 쿼리는 다음과 같이이다 데이터 (순환 링크). 제 경우에는 재귀 쿼리를 처리해야합니다.

+0

누구든지이 문제에 직면하면 - 포스트그레스를 실행합니다. 'log_temp_files = 0'을 사용하면 임시 파일 생성에 대해 더 많이 볼 수 있습니다. –