Ближайший сосед SQL Server 2012

У меня очень простая структура таблицы, использующая пространственные данные:

     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

На самом деле, добавляя табличную подсказку (вынуждая использовать пространственный индекс), производительность запроса снижается, а не увеличивается :)

Спасибо


person Bogdan MITREA    schedule 06.11.2013    source источник


Ответы (1)


Согласно BOL, ваш предикат не поддерживается пространственным индексация. Вместо этого попробуйте:

SELECT top 15 T.ID
FROM dbo.TestT --with(index(IX_SpatialData_Geo))
      WHERE T.Geo.STIntersects(@region) = 1
ORDER BY T.Geo.STDistance(@region)

Обратите внимание, что если вы ищете ближайший, вам нужно будет поместить туда предложение ORDER BY; TOP без одного является произвольным.

person Ben Thul    schedule 06.11.2013
comment
Это худшее событие сейчас. Я думаю, проблема в том, как я создаю пространственный индекс. - person Bogdan MITREA; 07.11.2013
comment
Эффективность фильтра равна 0, и я не понимаю, почему. Internal_Filter_Efficiency 0 Primary_Filter_Efficiency 0,130907186804556 - person Bogdan MITREA; 07.11.2013
comment
Хм... интересно. Можете ли вы опубликовать DDL для своей таблицы и пространственный индекс в исходном вопросе? Я бы тоже попросил некоторые образцы данных, но это может подтолкнуть... - person Ben Thul; 07.11.2013
comment
Я только что добавил DDL для создания таблиц и индексов. Для данных вы можете легко создать очень короткий скрипт. Спасибо :) - person Bogdan MITREA; 07.11.2013
comment
Другая сторона этого заключается в том, что ваш индекс может быть недостаточно избирательным. Это будет зависеть от данных. Рассмотрим непространственный запрос, в котором у вас есть индекс для столбца и где ваше предложение where может в конечном итоге использовать этот индекс, но в конечном итоге вернет значительную часть таблицы. Оптимизатор выберет сканирование таблицы, потому что упреждающее чтение повышает эффективность. - person Ben Thul; 08.11.2013