У меня очень простая структура таблицы, использующая пространственные данные:
CREATE TABLE Test
(
[ID] int not null,
[GeoLocation] geometry not null,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
)) on [PRIMARY]
Вот это DDL для пространственного индекса:
CREATE SPATIAL INDEX [IX_GeoLocation_Geo] ON dbo.[Test]
(
GeoLocation
)USING GEOMETRY_GRID
WITH (BOUNDING_BOX =(-180, -90, 180, 90), GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), CELLS_PER_OBJECT = 1024, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
У меня есть первичный ключ в столбце [ID]
и пространственный индекс в столбце GeoLocation
. Для пространственного индекса я использую схему тесселяции «Геометрическая автоматическая сетка».
Даже у меня в базе всего несколько тысяч строк, запрос на получение ближайшего соседа довольно медленный.
SELECT top 15 T.ID
FROM dbo.TestT --with(index(IX_SpatialData_Geo))
WHERE T.Geo.Filter(@region) = 1
На самом деле, добавляя табличную подсказку (вынуждая использовать пространственный индекс), производительность запроса снижается, а не увеличивается :)
Спасибо