prestazioni dell'indice spaziale del server sql


14

Ho un tavolo con circa 2 milioni di dischi. Creo un indice spaziale, usando le impostazioni predefinite diverse dal riquadro di selezione. Ho notato che alcune query sono estremamente veloci e altre estremamente lente. Il fattore determinante appare alla dimensione del poligono utilizzato nella query.

Su aree di ricerca più grandi, l'utilizzo WITH(INDEX(SIX_FT5))rallenta notevolmente la query (da 0 secondi a 15+ secondi). Su aree di ricerca più piccole, l'esatto contrario è vero.

Ecco alcune delle domande con cui sto testando:

Veloce:

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) 

Qualcuno sa cosa sta succedendo qui?


Stavo attraversando qualcosa di simile dba.stackexchange.com/questions/61289/… l'altro giorno ... Non stavo generando un poligono dal testo, ma stavo intersecando punti e poligoni ... Ho specificato di usare l'indice spaziale sul punto, che ha avuto risultati di grande velocità. Ho quindi provato a utilizzare l'indice spaziale sul poligono e ho avuto prestazioni molto scarse ... che sembra l'esatto contrario del tuo problema!
DPSSpatial

4
Se ci pensi, cambiare la dimensione della busta di ricerca dovrebbe avere un impatto significativo sulla query: più righe vengono restituite attraverso un indice, più lenta è la risposta. A un certo punto, diventa più veloce eseguire la scansione della tabella completa e eliminare le righe in base alla busta. Suggerirei di dedicare più tempo alle opzioni dell'indice spaziale, poiché probabilmente hai spazio per l'ottimizzazione dell'indice.
Vince il

I tuoi record rappresentano punti? Questo non è stato dichiarato. Inoltre, puoi pubblicare la sintassi di creazione dell'indice che hai usato? AutoGrid?
Gischimp,

Ho usato "Geography Auto Gird" e "Cells per Object" = 4000. Intersecato 110+ milioni di punti con ~ 45K poligoni.
Michael

1
Un'altra cosa che devi ricordare è che un'intersezione è un'operazione complessa, prima deve guardare se gli elementi associati si intersecano, operazione relativamente veloce attraverso gli indici, ma poi per ogni elemento che corrisponde, deve calcolare se ogni singolo oggetto si interseca effettivamente, il che è ancora un'altra operazione, più costosa, che diventa ancora più costosa poiché i poligoni sono più complessi e / o più numerosi.
AKK2

Risposte:


1

Come commentato da @Vince :

Se ci pensi, cambiare la dimensione della busta di ricerca dovrebbe avere un impatto significativo sulla query: più righe vengono restituite attraverso un indice, più lenta è la risposta. A un certo punto, diventa più veloce eseguire la scansione della tabella completa e eliminare le righe in base alla busta. Suggerirei di dedicare più tempo alle opzioni dell'indice spaziale, poiché probabilmente hai spazio per l'ottimizzazione dell'indice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.