2015-01-20 3 views
0

인덱스 생성/삭제와 관련된 몇 가지 문제가 있습니다. 그래서 원래 나는pg_class 데이터가 손상 되었습니까? 존재하지 않는 테이블의 고스트 인덱스

DROP INDEX IF EXISTS ros_tmp_schoolid_IX; 

다음

CREATE INDEX ros_tmp_schoolid_IX on ros.sometable USING btree (somecolumn); 

을했고 그것은 인덱스가 이미 다음

존재 내가

IF EXISTS (SELECT 1 
      FROM pg_class c 
      JOIN pg_namespace n ON n.oid = c.relnamespace 
      WHERE c.relname = 'ros_tmp_schoolid_IX' 
      AND n.nspname = 'ros') 
THEN 
    DROP INDEX ros_tmp_schoolid_IX; 
END IF; 

내 방법을 전환 불평하지만, 난 여전히 해요 인덱스가 존재하지 않는 오류가 발생했습니다 ... 그래서 pg_class 테이블을 살펴 보았습니다. o 해당 색인에 대한 레코드를 찾습니다.

나는 또한 모든 시도

다음과 아무도 일하지 :

  1. 이 테이블을 삭제;
  2. 재 인덱싱은// 분석 전체 데이터베이스를
  3. 재 인덱싱 테이블 pg_class
  4. 레일과

내가 PostgreSQL을 9.3을 사용하고 있습니다 (4.1.5)를 진공 청소기로 청소. 이것은 테스트 스위트를 실행할 때 무작위로 발생합니다 ... 많은 양의 데이터를 처리 할 때 임시 테이블을 사용하고 작업이 끝난 후 드롭합니다.

문제의 원인이 무엇인지 모르겠습니다. 내가 조사해야 할 것이 있습니까?

감사합니다.

=========

또한, 내가 pg_class 더 몇을 발견, 나는 그것을 청소하는 방법을 필요가 있다고 생각합니다.

그래서 다른 테이블에서 같은 이름의 인덱스를 만들려고했지만 성공했습니다. 하지만 .. 내가 다시 떨어 뜨리려고 할 때 ... 나는 관계가 존재하지 않는 오류가 발생했습니다. 스키마의 이름을 포함 할 : 그때는 관계가 이미 존재 말하는 ... 포스트 그레스가 결정할 수 없습니다 ...

+0

'DROP INDEX IF에서 ros_tmp_schoolid_ix을 찾을 수 있습니다 CREATE INDEX ros_tmp_schoolid_IX ... 존재 다음, 소문자로 변환 될 것이다 "ros_tmp_schoolid_IX ";"(그리고 미래에 : 대/소문자 구분자를 피하십시오, 그들은 PITA, IMHO입니다.) – joop

+0

Hello joop은 인덱스가 존재하지 않기 때문에 건너 뜁니다. 내가 여기서하려고하는 것은 1. pg_class의 유효하지 않은 레코드를 정리하는 것입니다. 2.이 색인을 다시 작성하십시오. 색인이 존재하지 않으므로 색인 다시 생성이 작동하지 않습니다. 명명 제안 주셔서 감사합니다. –

+0

'(선택 1 FROM pg_class c 조인 pg_namespace n ON n.oid = c.relnamespace c.relname ILIKE 'ros_tmp_schoolid_IX'AND n.nspname = 'ros')'결과는 무엇입니까? – joop

답변

1

짧은 버전, 그 후 INDEX 쿼리를 만들 권리를 실행하려고

DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX; 

설명 :

인덱스를 생성, 그것은 지정된 테이블과 같은 스키마로 자동으로 이동합니다. 인덱스를 삭제하면

No schema name can be included here; the index is always created in the same schema as its parent table

그러나, 스키마가 검색 경로에없는 경우에 지정해야합니다 다음 doc 알 수 있듯이 스키마 이름조차 허용되지 않습니다. 아마도 ros은 귀하의 경우 search_path에 없습니다.

코멘트에서 언급 한 바와 같이 또한, 큰 따옴표로 묶어야 인덱스 대문자로 이름하지만 그래서 당신이 pg_class.relname

+0

감사합니다! 지금 테스트 해봐. –

+0

감사합니다! :) 오늘 뭔가 새로운 것을 배웠습니다. –