전체 스키마에서 PostGIS에 공간 인덱스 생성


9

SPIT (QGIS 플러그인)를 사용하여 PostGIS 데이터베이스에 여러 shapefile을로드했습니다. 이 레이어에는로드시 작성된 공간 인덱스가 없습니다. 각 레이어에 대한 쿼리를 작성하지 않고 스키마의 각 레이어에 대한 공간 인덱스를 만드는 방법이 있는지 궁금합니다. 저는 PostGIS 스크립트 작성자가 아니므로 도움을 주시면 감사하겠습니다.

감사

답변:


8

지오메트리 열에서 인덱스를 일괄 생성하려면 방금 중단 한이 plpgsql 함수를 사용해 볼 수 있습니다.

CREATE OR REPLACE FUNCTION BatchIndex(sn text, tn text, cn text) RETURNS void AS $$
DECLARE i_exists integer;
DECLARE idxname text;
BEGIN
  idxname := 'idx_' || tn || '_' || cn;
  select into i_exists count(*) from pg_class where relname = idxname;

  IF i_exists = 0 THEN
    EXECUTE 'CREATE INDEX ' ||idxname || ' ON '
      || sn || '.' || tn
      || ' USING GIST(' || cn || ')';
  END IF;
END;
$$ LANGUAGE plpgsql;

데이터베이스에서 분노로 시도하지는 않았지만 작업을 수행하는 것 같습니다.

그것을 사용하려면 SELECT다음과 같은 문장을 실행 하십시오.

select BatchIndex('public', f_table_name, f_geometry_column) from geometry_columns where f_table_schema = 'public';

모든 지오메트리 열에 인덱스를 만들려면 다음과 같이 사용할 수 있습니다.

select BatchIndex(f_table_schema, f_table_name, f_geometry_column) from geometry_columns;

그런 다음 VACUUM ANALYZE모든 것을 정리 하기 위해 a 를 실행하십시오 .


정말 고마워요. 나는 이것을 실행했지만 문제가있는 것 같습니다. 스크립팅 능력이 부족할 수 있습니다. 그러나 SELECT 문을 실행할 때 다음 오류가 발생합니다. 오류 : function batchindex (unknown, character varying, character varying) LINE 1이 존재하지 않습니다. 배치를 얻기 위해 무언가를 추가하거나 다른 무언가를위한 자리 표시 자 인 경우. CREATE 쿼리가 문제없이 실행되었지만 인덱스가 생성되지 않았습니다.
— Ryan Garnett

흠 ... 그때 무슨 일이 일어나고 있는지 잘 모르겠습니다. 전달하는 첫 번째 매개 변수 는 알람 벨을 설정 unknown하는 것이 아니라 유형이라고 생각 character varying하지만 문제가있는 곳을 볼 수 없습니다. 나는 그것에 대해 약간의 생각을 줄 것이다. :)
— MerseyViking

2

지오메트리가있는 뷰가있는 경우 최상위 답변이 작동하지 않습니다. 뷰에서 인덱스를 작성하지 않으려는지 확인하기 위해 'IF'문을 변경하면 해당 문제가 해결됩니다. 지오메트리와 함께 뷰를 사용하려면이 선을 바꾸십시오.

IF i_exists = 0

이것으로 :

IF i_exists = 0 AND tn IN (SELECT table_name, table_type FROM information_schema.tables WHERE table_type = 'BASE TABLE')

1

테이블이 '빌딩'이라고 말하면 GIST를 사용하여 색인을 생성 할 수 있습니다

CREATE INDEX building_gindx ON building USING GIST (geom);

당신이 찾고있는 것입니까?


감사합니다 Naresh, 아니요 배치 시스템에서 스키마의 모든 테이블에 대한 인덱스를 만드는 방법을 찾고 있습니다.
— Ryan Garnett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.