Finden Sie PostGIS-Tabellen, in denen Indizes fehlen?

10

Kürzlich habe ich mich umgesehen pg_stat_user_tablesund war überrascht, auf einigen meiner räumlichen Tabellen eine hohe Anzahl aufeinanderfolgender Scans zu sehen. Sicher genug, diesen Tabellen fehlten räumliche Indizes.

Wie finde ich alle Tabellen mit einer nicht indizierten Geometriespalte?

dbaston
quelle
Vielen Dank für den Verweis auf pg_stat_user_tables. Es ist ermutigend, dass jemand von Ihrem Wissen solche Fehler zugibt. Zu den Jungen bei der Arbeit, die ich betreue, sage ich immer: Wenn es keinen natürlichen Kandidaten für einen Primärschlüssel gibt, fügen Sie eine serielle Spalte hinzu. Definieren Sie immer die SRID und den Geometrietyp. Fügen Sie immer einen räumlichen Index hinzu. Weil Sequenz-Scans mit einer Million Zeilen funktionieren könnten, aber es kommt ein Punkt ..... Tun Sie, was ich sage, und nicht wie ich: D.
John Powell

Antworten:

9

Tabellen mit fehlenden räumlichen Indizes können durch Abfragen der Systemtabellen gefunden werden:

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;
dbaston
quelle
Könnte es noch besser sein als WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Siehe trac.osgeo.org/gdal/ticket/6896 .
user30184
@ user30184 Kannst du das t.typtype = 'b'Stück erklären ?
Dbaston
1
Es ist eigentlich nutzloses Stück. Die Codeänderung in GDAL diente dazu, eine seltene Situation zu behandeln, in der die Standard-PostgreSQL-Datenbank eine Tabelle mit dem Namen "Geometrie" enthält. Das hat auch einen Eintrag in pg_type, aber mit typtype = 'c'. Wenn Sie jedoch PostGIS installiert haben, ist es nicht möglich, eine solche Situation zu beenden. create table "geometry" (foo text);gibtERROR: 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.
Benutzer30184
6

Ich habe eine Funktion erstellt, die automatisch alle fehlenden Indizes erstellen kann. Ein "simulieren" -Parameter ermöglicht das Abrufen der Liste der fehlenden räumlichen Indizes, führt jedoch keinen CREATE INDEX aus

Siehe https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

Führen Sie Folgendes aus, um die Liste der fehlenden Indizes abzurufen:

SELECT * FROM create_missing_spatial_indexes(True)

Führen Sie Folgendes aus, um die erforderlichen Indizes zu erstellen:

SELECT * FROM create_missing_spatial_indexes()

oder

SELECT * FROM create_missing_spatial_indexes(False)
user779641
quelle
Lief wie am Schnürchen! Tolles Werkzeug.
RyanKDalton