rendimiento del índice espacial del servidor sql

14

Tengo una tabla con alrededor de 2 millones de registros. Creo un índice espacial, utilizando los valores predeterminados que no sean el cuadro delimitador. He notado que algunas consultas son extremadamente rápidas y otras extremadamente lentas. El factor determinante aparece en el tamaño del polígono utilizado en la consulta.

En áreas de búsqueda más grandes, el uso WITH(INDEX(SIX_FT5))ralentiza considerablemente la consulta (de 0 segundos a más de 15 segundos). En áreas de búsqueda más pequeñas, exactamente lo contrario es cierto.

Estas son algunas de las consultas con las que estoy probando:

Rápido:

SELECT TOP(1000) * FROM [FT5] WHERE (shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1) 

Lento:

SELECT TOP(1000) * FROM [FT5] WITH(INDEX(SIX_FT5)) WHERE (shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1) 

Alguien sabe lo que está pasando aquí?

mdm20
fuente
Estaba pasando por algo similar dba.stackexchange.com/questions/61289/... el otro día ... No estaba generando un polígono a partir del texto, sino que estaba intersectando puntos y polígonos ... Especifiqué usar el índice espacial en el punto, que tuvo resultados de gran velocidad. Luego intenté usar el índice espacial en el polígono, y tuve un rendimiento muy pobre ... ¡lo que parece ser exactamente lo contrario de tu problema!
DPSSpatial
44
Si lo piensa, cambiar el tamaño del sobre de búsqueda debería tener un impacto significativo en la consulta: cuantas más filas se devuelvan a través de un índice, más lenta será la respuesta. En algún momento, se vuelve más rápido escanear la tabla completa y tirar las filas según el sobre. Le sugiero que pase más tiempo con las opciones de índice espacial, ya que probablemente tenga espacio para la optimización del índice.
Vince
¿Sus registros representan puntos? Eso no fue declarado. Además, ¿puede publicar la sintaxis de índice de creación que utilizó? ¿Fue AutoGrid?
gischimp
He usado 'Geography Auto Gird' y 'Cells per Object' = 4000. Intersected 110+ million points with ~ 45K polygons.
Michael
1
Otra cosa que debe recordar es que una intersección es una operación compleja, primero debe ver si los elementos unidos se cruzan, una operación relativamente rápida a través de índices, pero luego, para cada elemento que coincide, debe calcular si cada elemento realmente se cruza, lo que Es otra operación más costosa, que se vuelve aún más costosa a medida que los polígonos son más complejos y / o más numerosos.
AKK2

Respuestas:

1

Como comentó @Vince :

Si lo piensa, cambiar el tamaño del sobre de búsqueda debería tener un impacto significativo en la consulta: cuantas más filas se devuelvan a través de un índice, más lenta será la respuesta. En algún momento, se vuelve más rápido escanear la tabla completa y tirar las filas según el sobre. Le sugiero que pase más tiempo con las opciones de índice espacial, ya que probablemente tenga espacio para la optimización del índice.

PolyGeo
fuente