Optimización de PostGIS: agrupe entidades espacialmente cercanas físicamente en el disco

Pregunta:

Estoy trabajando en mi primera base de datos PostGIS y esperaba encontrar algunas mejoras de rendimiento para la representación en vivo.

Estoy representando un mapa directamente desde una base de datos PostGIS (9.1, 2.0) que contiene una importación de datos OSM (usando imposm3). Lo más importante es que mi tabla de carreteras tiene unos 30 GB y se está procesando un poco más lento de lo que me gustaría. En el futuro, usaré alternativas generalizadas a la tabla de carreteras totalmente detallada con niveles de zoom más altos, pero por ahora solo la renderizo con niveles de zoom razonablemente bajos. Ya he tomado nota de algunas sugerencias de ajuste específicas de PostGIS y han tenido un buen impacto en el rendimiento.

Mi pregunta es si sería factible y si valdría la pena reorganizar cómo se almacenan en el disco las entidades de mi tabla de carreteras. Por ejemplo, me imagino que si estoy consultando un área del tamaño de un vecindario y las entidades adjuntas están en la misma página de disco físico, el rendimiento sería mucho mejor que si se ordenaran según el orden de envío de OSM (que me temo que son ahora). Me pregunto si hay utilidades o medios sugeridos para reordenar las entidades en el disco.

Alternativamente, ¿quizás me beneficiaría crear nuevas tablas más pequeñas separadas espacialmente de la tabla más grande de 30 GB?

¡Gracias!

Editar:

En parte por terquedad y en parte por curiosidad, seguí adelante y ejecuté la CLUSTER table ON hash_index y esto terminó empeorando un poco el rendimiento de mi tabla. Después de buscar y aprender un poco, me di cuenta de que lo primero que uno debe hacer cada vez es EXPLAIN query . Terminó que había algunas rarezas con los tipos y mis consultas ni siquiera usaban el índice.

Estoy agregando esto principalmente como un anuncio de servicio público para cualquier persona que pueda terminar aquí buscando la solución de agrupamiento: verifique que sus índices sean correctos y ejecute la explain para asegurarse de que se estén utilizando .

Respuesta:

Depende, naturalmente. Si su representación solo tiene que escanear espacialmente unos "pocos" (miles) registros para dibujar, entonces la agrupación física podría ayudar un poco. Sin embargo, si su renderizado tiene que escanear cientos de miles de registros (escenario clásico: encuéntreme todas las carreteras en este cuadrado, pero ignore las carreteras locales), entonces la agrupación no hará mucha diferencia, mientras que la clasificación previa de sus datos en escala- los tipos apropiados (tabla de autopistas, tabla de arterias, etc.).

Para agrupar simplemente, solo:

CLUSTER mytable USING myspatialindex;

Para un clúster con una garantía de homogeneidad espacial ligeramente más fuerte:

CREATE INDEX myhashidx ON mytable (ST_GeoHash(geom));
CLUSTER mytable USING myhashidx;

Esto utiliza un desglose de cuatro árboles para agrupar, lo que ayuda a garantizar que las cosas "cercanas" estén cerca, de una manera que el árbol r más genérico bajo el índice espacial estándar no lo hace.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım