전체 스키마에서 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.