인덱스가없는 PostGIS 테이블을 찾으십니까?


10

최근에 나는 주변을 둘러 pg_stat_user_tables보았고 일부 공간 테이블에서 많은 수의 순차적 스캔을보고 놀랐습니다. 물론이 테이블에는 공간 인덱스가 없습니다.

색인화되지 않은 기하학 열이있는 모든 테이블을 어떻게 찾을 수 있습니까?


pg_stat_user_tables를 참조 해 주셔서 감사합니다. 당신의 지식을 가진 누군가가 그러한 실수를 인정한다는 것은 가슴이 is니다. 내가 멘토링하는 직장인에게는 항상 다음과 같이 말합니다. 기본 키에 대한 자연스러운 후보가 없으면 일련 열을 추가하십시오. 항상 SRID 및 지오메트리 유형을 정의하십시오. 항상 공간 인덱스를 추가하십시오. 시퀀스 스캔은 백만 행에서 작동 할 수 있지만, 요점이 있습니다 ..... 내가 한 것보다 내가 말한대로하십시오.
존 파월

답변:


9

공간 인덱스가 누락 된 테이블은 시스템 테이블을 쿼리하여 찾을 수 있습니다.

SELECT g.* 
FROM 
  (SELECT 
     n.nspname, 
     c.relname, 
     c.oid AS relid, 
     a.attname, 
     a.attnum 
   FROM pg_attribute a 
   INNER JOIN pg_class c ON (a.attrelid=c.oid)
   INNER JOIN pg_type t ON (a.atttypid=t.oid)
   INNER JOIN pg_namespace n ON (c.relnamespace=n.oid) 
   WHERE t.typname='geometry' 
   AND   c.relkind='r'
 ) g 
LEFT JOIN pg_index i ON (g.relid = i.indrelid AND g.attnum = ANY(i.indkey)) 
WHERE i IS NULL;

그것으로 더 나아질 수 WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'있습니까? trac.osgeo.org/gdal/ticket/6896을 참조하십시오 .
user30184

@ user30184 그 t.typtype = 'b'부분 을 설명해 주 시겠습니까?
dbaston

1
실제로 쓸모없는 작품입니다. GDAL의 코드 변경은 표준 PostgreSQL 데이터베이스에 "geometry"라는 테이블이있을 때 드문 상황을 처리하기위한 것입니다. pg_type에도 typtype = 'c'항목이 있습니다. 그러나 PostGIS가 설치되어 있으면 그러한 상황을 끝낼 수 없습니다. create table "geometry" (foo text);제공ERROR: type "geometry" already exists HINT: A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
user30184

6

누락 된 모든 인덱스를 자동으로 만들 수있는 함수를 만들었습니다. "simulate"매개 변수를 사용하면 누락 된 공간 인덱스의 목록을 얻을 수 있지만 CREATE INDEX는 수행하지 않습니다.

참조 https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042를

누락 된 인덱스 목록을 얻으려면 다음을 실행하십시오.

SELECT * FROM create_missing_spatial_indexes(True)

필요한 색인을 작성하려면 다음을 실행하십시오.

SELECT * FROM create_missing_spatial_indexes()

또는

SELECT * FROM create_missing_spatial_indexes(False)

매력처럼 일했다! 훌륭한 도구입니다.
RyanKDalton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.