2017-12-07 7 views
0

Ich versuche Breite/Länge zu einer bestimmten Nachbarn Lage anzupassen, koordiniert sind von unten FormatST_Contains zu viel Zeit

ST_GeometryFromText('POINT('||longitude||' '||latitude||')') as coordinates 

und geom ist von Spaltentyp-Geometrie.
ich habe bereits erstellten Indizes wie unten

CREATE INDEX coordinates_gix ON master_data USING GIST (coordinates); 
CREATE INDEX boro_geom_indx ON Borough_GEOM USING gist(geom); 

habe ich fast 3 Millionen Datensätze in der Haupttabelle und 200 geometrische Information in der GEOM Tabelle. Die Analyse der Abfrage dauert so lange (2 Stunden). Bitte lassen Sie mich wissen, wie kann ich diese Abfrage optimieren.

Vielen Dank im Voraus.

+0

Was meinst du mit ‚versuchen, zu einer bestimmten Nachbarn Lage zu passen?‘. Warum verwenden Sie st_astext() auf Ihrer Join-Bedingung? Ich gehe davon aus, dass die geom-Spalte vom Geometrietyp ist. Wenn dies der Fall ist, können Sie 'st_contains (geom, coordinates)' verwenden. Sie können auch 'st_within' versuchen, wenn geprüft werden soll, ob die Punkte innerhalb eines Polygons liegen oder nicht. – Aparichith

+0

Ist bideid einzigartig? –

Antwort

2
  • Wie in den Kommentaren erwähnt, verwenden Sie nicht ST_AsText(): das gehört nicht dorthin. Es überträgt das Geom auf Text und kehrt dann zu Geom zurück. Aber wichtiger ist, dass dieser Prozess den Index wahrscheinlich fummelt.
  • Wenn Sie nur auf Spalte eindeutig sind, verwenden Sie DISTINCT ON, keine Notwendigkeit, die anderen zu vergleichen.
  • Wenn Sie in der ID-Spalte eindeutig sind und nur dann eine Verknüpfung hinzufügen, wenn Sie Selektivität hinzufügen möchten, verwenden Sie EXISTS. Kommen irgendwelche dieser Spalten von borough_GEOM anders als geom?

ich mit so etwas wie dieser beginnen würde,

CREATE TABLE address_classification AS 
    SELECT DISTINCT ON (buildingid), 
    buildingid, 
    street, 
    city, 
    state, 
    neighborhood, 
    borough 
    FROM master_data 
    JOIN borough_GEOM 
    ON ST_Contains(geom,coordinates);