Erstellen Sie einen räumlichen Index in PostGIS für ein gesamtes Schema

9

Ich habe eine Reihe von Shapefiles mit SPIT (QGIS-Plugin) in meine PostGIS-Datenbank geladen. Für diese Ebenen wurde beim Laden kein räumlicher Index erstellt. Ich frage mich, ob es eine Möglichkeit gibt, einen räumlichen Index für jede Ebene im Schema zu erstellen, ohne eine Abfrage für jede Ebene zu schreiben. Ich bin kein guter PostGIS-Drehbuchautor, daher wäre jede Hilfe sehr dankbar.

Vielen Dank

Ryan Garnett
quelle

Antworten:

8

Wenn Sie Batch-Indizes für Geometriespalten erstellen möchten, können Sie diese plpgsql-Funktion ausprobieren, die ich gerade aktiviert habe:

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;

Ich habe es in meiner Datenbank nicht im Zorn versucht, aber es scheint den Job zu machen.

Um es zu verwenden, führen Sie einfach eine SELECTAnweisung wie folgt aus:

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

Um Indizes für alle Geometriespalten zu erstellen, können Sie diese folgendermaßen verwenden:

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

Führen Sie anschließend eine aus, VACUUM ANALYZEum alles aufzuräumen.

MerseyViking
quelle
Vielen Dank, das sieht gut aus. Ich habe dies ausgeführt, aber es scheint ein Problem zu geben, wohlgemerkt, das könnte an meiner mangelnden Skriptfähigkeit liegen. Wenn ich jedoch die SELECT-Anweisungen ausführe, wird folgende Fehlermeldung angezeigt: FEHLER: Funktion Batchindex (unbekannt, Zeichen variierend, Zeichen variierend) existiert nicht LINE 1: Wählen Sie BatchIndex ('public', f_table_name, f_geometry_column) ... Ich bin nicht sicher wenn ich etwas hinzufügen soll, um die Charge zu erhalten, oder wenn dies nur ein Platzhalter für etwas anderes ist. Die CREATE-Abfrage wurde ohne Probleme ausgeführt, es wurden jedoch keine Indizes generiert.
Ryan Garnett
Hmm ... ich bin mir nicht sicher, was dann dort passiert. Die Tatsache, dass der erste Parameter, den Sie übergeben, eher vom Typ ist unknownals character varyingAlarmglocken auszulösen, aber ich kann nicht erkennen, wo ein Problem vorliegt. Ich werde darüber nachdenken, während irgendwelche PostgreSQL-Gurus da draußen Lust haben, es auszuprobieren? :)
MerseyViking
2

Die Top-Antwort funktioniert nicht, wenn Sie Ansichten mit Geometrie haben. Durch Ändern der IF-Anweisung, um zu überprüfen, ob Sie nicht versuchen, einen Index für eine Ansicht zu erstellen, wird dieses Problem behoben. Wenn Sie Ansichten mit Geometrie verwenden möchten, ersetzen Sie diese Linie:

IF i_exists = 0

mit diesem:

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

Angenommen, Ihre Tabelle wird erstellt. Sie können sie mithilfe von GIST indizieren

CREATE INDEX building_gindx ON building USING GIST (geom);

Ist es das, wonach du suchst?

Naresh
quelle
Danke Naresh, nein, ich suche nach einer Möglichkeit, Indizes für alle Tabellen in einem Schema in einem Batch-System zu erstellen.
Ryan Garnett