2016-07-06 3 views
1

다른 구체화 된보기에 의존하는 구체화보기가 있습니다.postgresql 9.5 - 부모가 동시에 새로 고침하는 동안 하위 구현보기를 잠급니다.

matviewA matviewB matviewC 
    \  |  /
     matviewX 

부모 구체화 된 뷰를 동시에 동시에 새로 고치고 싶습니다. (아래의 그림과 같이 이것은 실제로 문제가되지 않습니다.) [현재 환경에서는 각 부모가 새로 고침하는 데 약 한 시간이 걸립니다.

psql -c "refresh materialized view concurrently matviewX" & 

그것은 바로 실행하고 그들이에서 자녀를 고정하지 않기 때문에 부모가 상쾌 끝날 때까지 기다리지 않는다 : 나는 아이에 새로 고침 킥오프 그러나 경우]

psql -c "refresh materialized view concurrently matviewA" & 
psql -c "refresh materialized view concurrently matviewB" & 
psql -c "refresh materialized view concurrently matviewC" & 

스스로 리프레쉬하는 동안 그들 자신은 이미 리프레쉬하고있다.

psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewA" & 
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewB" & 
psql -c "lock matviewX in share mode; refresh materialized view concurrently matviewC" & 

불행하게도, 당신이 구체화 된 뷰에 명시 적으로 잠금을 넣을 수 없습니다

나는 부모가 실행하는 동안 아이에 잠금을 넣어했습니다.

"동시"부모에서 사용하지 않으면 자식 구체화 된보기를 읽을 수 없게됩니다. (그러나 자식 새로 고침이 실행되기 전에 대기합니다.)

"psql -c"를 호출하는 (bash) 래퍼 스크립트에서 일부 잠금 관리를 작성할 수 있습니다. 아니면보다 정교한 타사 작업 스케줄러를 사용할 수도 있습니다. 더 쉬운 방법이 있기를 바랬습니다.

함수를 작성하고 모든 새로 고침을 해당 함수에 넣은 다음 수동 명시 적 잠금 관리에 임시 테이블을 사용할 수 있습니다.

어쨌든 자문 잠금을 사용하십시오.

제안 사항?

답변

1

당신은 단순히 (https://stackoverflow.com/a/18663969/3886053 참조) wait을 사용할 수

for parent in matviewA matviewB matviewC; do 
    psql -c "refresh materialized view concurrently $parent" & 
    echo "Started refreshing materialized view $parent" 
done 
echo -n "Waiting for all parents to finish... " 
wait 
echo "finished. Refreshing now the child materialized view" 
psql -c "refresh materialized view concurrently matviewX" 
+0

아하! 그건 트릭을 했어, 고마워! – rotten

관련 문제