Domanda

Al momento ho un sito con una tabella che ha Lat colonne galleggiante / lunghi, e un indice di quei 2 colonne più un altro quello che ho bisogno di recuperare.

Sono costantemente l'interrogazione di questa tabella per ottenere le righe che ricadono all'interno di un raggio da un certo punto (In realtà sto ricevendo una piazza per la velocità), ma ho solo bisogno i campi che sono già indicizzati, in modo da questo indice è infatti copertura, e il piano di esecuzione ha solo 2 fasi:

Index Seek  (cost: 100%) and SELECT (cost: 0%)

Ora, sto cercando di sfruttare le caratteristiche spaziali di SQL 2008. Ho creato la colonna Geografia, riempito, creato l'indice spaziale, le opere.

E tutto funziona bene, tranne che il piano di esecuzione ha un milione di passi, e il 74% del tempo viene speso per un Clustered Index Seek, dove si unisce le righe si trova nel indice spaziale per la tabella effettiva, a ottenere il resto dei dati ...
(L'indice spaziale Seek prende 1% del costo piano di esecuzione)

Quindi, a quanto pare, si sta usando l'indice spaziale in modo appropriato e trovare i dischi che ho bisogno di molto più veloce di prima con il mio indice "regolare" su Lat / Long, ma l'unione alla tabella principale mi sta uccidendo, la query spaziale prende 7 volte più a lungo come il mio vecchio.

C'è un modo per aggiungere ulteriori colonne per l'indice spaziale in modo che tratteremo e può fare le cose in un unico passaggio, proprio come stava facendo prima?
Ci sono altre cose che potrei fare per migliorare questa situazione?


UPDATE: ho trovato che "regolari" gli indici possono "includere" altre colonne utilizzando la parola chiave INCLUDE (che io non conoscevo, ho usato per includere solo le colonne l'indice stesso)
In base alla documentazione di qui , tale clausola non è un'opzione per indici spaziali ... Tutte le idee?

Grazie!
Daniel

È stato utile?

Soluzione

No, purtroppo non esiste attualmente alcun modo per creare un indice spaziale che copre - l'interrogazione farà sempre la ricerca di segnalibro alla tabella di base, al fine di ottenere il valore geografia per la riga.

Per STIntersects, questo è chiaramente sempre richiesto come abbiamo ancora bisogno di eseguire il filtro secondario sull'oggetto geografia effettivo per verificare che effettivamente interseca l'oggetto parametro. Tuttavia, se non si necessita di risposte precise e in grado di utilizzare il filtro (), allora sarebbe possibile fornire la chiave primaria dall'indice senza fare la ricerca alla tabella di base a tutti. Sostenere questo è qualcosa che stiamo considerando per il prossimo rilascio.

In termini di accelerare la query corrente, hai provato utilizzando il filtro () e messa a punto l'indice con l'uscita dal sp_help_geography_index?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top