2014-08-27 2 views
1

는 PostgreSQL의 버전 : 포스트 그레스 플러스 고급 서버 9.2
운영 체제 : Windows 7/8PostgreSQL의 잠금

내가 그것을 같은 역할을 저장 프로 시저는 다음과 같습니다
1. 을 지 웁니다 에 전달 된 매개 변수의 몇 가지를 기반으로보기에서 표
2. 선택 (항상 동일한보기) WHERE
절 (예를 위해서 항상 동일한 매개 변수)
3. 테이블 1에 위의 선택 결과를 삽입하십시오. 5

BEGIN 

    PERFORM clear_table1(p_session_id); 

    INSERT INTO table1 (session_id, id1, adress, x, y) 
    SELECT p_session_id, id1, adress, x, y 
     FROM myview 
     WHERE (CONDITION) 
      AND (CONDITION) 
      AND (CONDITION) 
      AND (lower(adress) LIKE lower(p_adress) OR p_adress IS NULL) 
      LIMIT 6000; 
END; 

첫 번째 시간 (항상 5 회) 나는 동일한 매개 변수를 사용하여 동일한 쿼리를 실행을 예상대로 실행, 다음과 같이

절차의 몸이 보인다. 다음 번 (6 번째) 그것은 엄청난 시간 동안 움직입니다. 수십 분.

select * from myfunction('session_id',NULL,NULL,'%adress%') 

서버 상태에서 PostgreSQL의 관리자에서보기, 나는보기가 채워되는 테이블과 함께 를 삽입하는 테이블에 대한 추가 잠금의 수를 관찰

수있는 사람과 PostgreSQL 환경에서이 동작을 해결할 수있는 설정이 있는지 알려주십시오. 또는 PG를 사용하는 다른 사람에게 이와 비슷한 일이 발생 했습니까?

감사합니다 !!!

나중에 편집 : - : 우리가 명시 적으로 저장 프로 시저

+1

1) 호출간에 커밋합니까? 2) 다른 세션에서 발행 된 6 개의 호출입니까? – wildplasser

+0

나중에 편집하십시오 – tartak

+0

왜 테이블을 지우는 기능을 사용합니까? 왜'delete from table' 또는'truncate table'만이 아닌가? – wildplasser

답변

0

추측의 말에 커밋하지 않습니다 - 문제는 항상 6 호출이 같은 세션 만든 경우 발생 기본 준비 임계 값으로 JDBC를 사용 중입니다.

서버 측 준비를 비활성화하면 문제가 해결되는지 확인하십시오. the PgJDBC docs을 참조하십시오.

느린 호출이 함수 내에있는 경우 실패합니다. auto_explain을 사용하도록 설정하고 기능 본문 처리를 사용하도록 설정합니다. 그런 다음 계획이 6 번째 호출에서 어떤 이유로 변경되는지 확인하십시오.

+0

찾아야 만했습니다 ... "함수 처리 중"SET auto_explain.log_nested_statements = 1; – Kuberchaun

-1

나는 이것이 정말로 오래된 질문이라는 것을 알고 있지만, 어제 나는 정확히 똑같은 문제가 있었다.

실현하기가 까다 롭습니다. 원인은 항상 6 번째 발생 이후입니다.

원인을 설명 할 수 없지만 해결할 수있었습니다.이

execute 'SELECT (sum(coalesce(debito.vl_conta,0))) ... 

SELECT (sum(coalesce(debito.vl_conta,0))) ... 

을 어디에

내 경우에는 내가 부분을 변경했다 그게 다야. 그러나 누군가를 위해 고통을당하는 경우를 대비하여 여기에 응답하십시오. 또는 어쩌면 그것이 일어나는 이유를 설명하십시오.

감사합니다.