2017-05-12 6 views
0

테이블 잠금없이 색인 크기를 포함해야한다는 요구 사항이 있습니다. 나는 '인덱스를 동시에 만들 수 있습니다.'를 사용하려고했지만 시스템 중 하나에서 생성 된 INVALID 인덱스가 발생했습니다. 우리는 시도했습니다 - 인덱스 삭제 - 동시에 인덱스 삭제 - 인덱스 다시 색인 간헐적으로 그들은 또한 붙어있어. 따라서 스크립트를 통해 인덱스를 생성하는 전체 접근 방식이 취약 해집니다.PostgreSQL 동시 색인 생성 - 유효하지 않은 색인

수동 개입없이 전체 증명할 수있는 방법에 대한 아이디어가 있으십니까? 그렇지 않다면 큰 테이블과 바쁜 테이블에서 자동으로 postgreSQL에 인덱스 크기를 포함시키는 다른 효과적인 방법은 무엇입니까?

+0

일반적으로 동시 색인 생성이 실행 중 취소되어 색인이 잘못되었습니다. 인덱스 생성이 성공적으로 완료 되었습니까? –

+0

"인덱스 크기 포함"이란 무엇을 의미합니까? 색인은 필요한 크기를 가지며 크기는 구성 할 수 없습니다. 'CREATE/DROP INDEX CONCURRENTLY'는 여전히 테이블에 배타적 잠금을 요구하지만 짧은 기간 동안 만 필요합니다. 이를 방지 할 수있는 방법은 없으며 바쁜 서버에서이를 무시할 수 있습니다. –

+0

필자가 의도 한 것은 시간이 지남에 따라 증가하는 PG 테이블에서 인덱스 크기를 줄이는 것이 었습니다. 다시 색인 테이블/생성 드롭 인덱스를 사용하여 수행 할 수 있지만 모두 침입 기법입니다. – user2350659

답변

0

스크립트에서 색인을 동시에 빌드 할 때 이점을 얻으려면 다음 명령에 논리를 추가해야합니다 (트랜잭션에 넣을 수없는 경우). 다음 줄에 index가 INVALID가 아닌지 확인하기 만하면 스크립트를 중단합니다.

또한 액션을 역으로 수행합니다. 먼저 새 인덱스를 동시에 작성합니다. 성공하면 이전 것을 버리십시오.

https://www.postgresql.org/docs/current/static/sql-createindex.html :

같은 교착 상태 또는 고유 인덱스에 고유성 위반으로 테이블을 스캔하는 동안 문제가 발생하는 경우, CREATE INDEX 명령은 실패하지만 "잘못된"인덱스 뒤에 떠날 것이다 . 이 인덱스는 불완전하기 때문에 쿼리를 위해 무시됩니다. 그러나 은 여전히 ​​업데이트 오버 헤드를 소비합니다.

다른 차이점

정규 INDEX CREATE 명령 트랜잭션 블록 내에서 수행 수 있지만 CONCURRENTLY 못해 INDEX를 만들 수 있다는 것이다.

+0

중단하는 방법? 우리는 DROP INDEX/DROP INDEX CONCURRENTLY를 시도 할 때 검사했습니다 - 둘 다 간헐적으로 멈추었 고 다시 색인화 된 INVALID 색인을 제거하는 데 많은 시간이 걸렸습니다. – user2350659

+0

재 색인은 잘못된 색인을 동시에 다시 작성합니다. 무엇을 중단 할 수 있습니까? ... –

+0

잘못된 색인을 삭제하려고 할 때 DROP INDEX조차 언급 된 것처럼 잘못된 색인을 제거하는 방법이 중단되었습니다. – user2350659