Ich frage dies, weil ich hauptsächlich mit Oracle gearbeitet habe, aber im letzten Jahr habe ich mich mit PostGIS und SQLServer 2008 verdoppelt. Die meisten räumlichen Funktionen in Oracle funktionieren nicht ohne einen räumlichen Index, der den ORA-13226-Fehler zurückgibt:
13226, 00000, "Schnittstelle ohne räumlichen Index nicht unterstützt" // * Ursache: Die Geometrietabelle hat keinen räumlichen Index. // * Aktion: Stellen Sie sicher, dass die Geometrietabelle, auf die im räumlichen Operator verwiesen wird, einen räumlichen Index enthält.
Für mich macht das Sinn. Sie führen eine räumliche Abfrage aus = Sie müssen einen räumlichen Index haben. Soweit ich weiß, ist dies jedoch weder für PostGIS noch für SQL Server erforderlich. PostGIS scheint sogar Funktionen zu haben (_ * zB _STContains), die den räumlichen Index AUSSCHLIESSLICH nicht verwenden.
Die Frage ist also: Gibt es Fälle, in denen Sie keinen räumlichen Index verwenden sollten? Nicht unbedingt, ob es sich um einen Take-It- oder einen Leave-It-Ansatz handelt, dh, er macht keinen Unterschied, aber wo wird die Leistung beeinträchtigt, wenn der räumliche Index NICHT verwendet wird? Für mich ist der letzte Satz ein Widerspruch, aber warum würde PostGIS sonst diese Funktionen bereitstellen?
quelle
Antworten:
mapoholic,
Im Allgemeinen gibt es keinen Grund, eine räumliche Abfrage ohne räumlichen Index durchzuführen, es sei denn, Sie haben es mit wirklich kleinen Tabellen zu tun. Trotzdem würden Sie den ST_ verwenden, der keinen Index verwendet, aber die indizierbaren Kurzschlussboxoperatoren hat. Die Funktionen, die mit _ST beginnen, sind nicht für Endbenutzer gedacht. Der Grund, warum sie existieren, ist, weil sie müssen. PostGIS-räumliche Indizes verwenden SQL-Inlining, um die Verwendung des Index zu erzwingen - der _ST wird normalerweise von GEOS ausgeführt und der && ist der Index, der möglicherweise neu sortiert wird. Die _ST sind also wirklich ein Implementierungsartefakt.
Kurz gesagt, es ist keine einzige Funktion, sodass die Indexoperation so angeordnet werden kann, dass sie vor der intensiveren räumlichen Prüfung auf einmal erfolgt.
quelle
Wenn Ihr Dataset häufig hinzugefügt und aktualisiert wird, verlangsamen INSERT-, DELETE- und UPDATE-Anweisungen, die die Neuerstellung des Index bewirken, möglicherweise die Datenbank.
Bei Masseneinfügungen, z. B. beim Laden des gesamten OSM-Datasets in eine Datenbank, können die Indizes möglicherweise schneller gelöscht und anschließend neu erstellt werden.
Wenn es effizienter ist, einen Index zu ignorieren (zum Beispiel ist die Tabelle klein genug, um in den Speicher geladen zu werden), sollte der Datenbankabfrageprozessor dies automatisch tun.
Ich gehe davon aus, dass der Hauptgrund für die Ausführung von Abfragen ohne räumlichen Index darin besteht, den Leistungsvorteil zu messen, den Sie durch die Verwendung eines Index erzielen, ohne ihn löschen zu müssen.
Wenn Sie Abfragen und Kartenanzeigen eine enorme Leistungssteigerung bieten möchten, sollten Sie die Erstellung von Indizes zu einem günstigen Zeitpunkt in der Systementwicklung verschieben ...
quelle
Ich denke , das wird angedeutet, aber ich würde nicht einen räumlichen Index für eine Abfrage verwenden , wenn ich einen nicht-räumlichen Index hatte , dass ich stattdessen verwenden könnte. Zum Beispiel habe ich 2.113.450 Punkte, die sich über die Vereinigten Staaten erstrecken und in eine Tabelle geladen sind. Wenn ich alle Punkte ziehen wollte, die sich im Bundesstaat Alaska befanden, konnte ich entweder eine räumliche Abfrage durchführen, die den GIST-Index für die Punktgeometrien verwendete, um sie mit der Geometrie des Bundesstaates Alaska zu vergleichen, ODER ich konnte sie nur verwenden Das Feld "state_alpha" in den Punktdaten (die ebenfalls indiziert sind), um alle Punkte mit "state_alpha" = "AK" zurückzugeben.
"Wo ist der räumliche Teil davon", fragen Sie? Wenn ich nach dem Sammeln weitere räumliche Analysen der Alaska_Punkte durchführen muss, ist es schneller, diese Punktgeometrien zuerst mit einer nicht räumlichen Abfrage zu erfassen. Dies bedeutet auch, dass Sie bei sehr großen Datenmengen vom Hinzufügen eines Nachschlagefelds (oder einer Tabelle) profitieren. Auch hier weiß ich, dass dies wahrscheinlich für jeden sofort offensichtlich ist. Ich erwähne es nur, weil ich es in der Vergangenheit mit globalen Datensätzen erlebt habe, die nur räumlich indiziert wurden und bei denen eine gemeinsame Abfrage "Alle Features in einem Land" lautete. Durch das Hinzufügen eines indizierten country_fips-Felds haben wir eine Menge Leistung gewonnen.
Nachfolgend einige Ergebnisse von EXPLAIN ANALYZE, die den Punkt belegen. (HINWEIS: Ich habe versucht, die räumliche Abfrage mithilfe einer BBOX-Abfrage so effizient wie möglich zu gestalten. Die Verwendung der Statuskonturen hätte sie nur verlangsamt.)
quelle
Ich habe diese Aussage gerade bemerkt
Für mich macht das überhaupt keinen Sinn und ich denke, dass sowohl SQL Server als auch Postgis einen besseren Job machen oder Sie zumindest nicht mit Leistungsdetails belästigen. Tatsächlich verwenden SQL Server und Postgis manchmal nicht einmal den räumlichen Index (kehren Sie zum vollständigen Tabellenscan zurück).
Für Oracle müssen Sie den Index erstellen und daher user_sdo_geom_metadata ausfüllen.
Wenn Sie dies nur mit alphanumerischen Indizes vergleichen, gibt es sie aus Leistungsgründen. Ihre SQL-Anweisung sollte mit und ohne sie funktionieren.
Wenn Sie den Index in einer Oracle-Datenbank löschen, werden zahlreiche Fehler und Apps angezeigt, die keine räumlichen Abfragen verwenden können und daher nicht funktionieren.
quelle