Могу ли я создать “Охватывающий, пространственный” индекс в SQL Server 2008?

StackOverflow https://stackoverflow.com/questions/1347692

Вопрос

В настоящее время у меня есть сайт с таблицей, в которой есть столбцы Lat / Long float, и индекс по этим 2 столбцам плюс еще один, который мне нужно получить.

Я постоянно запрашиваю эту таблицу, чтобы получить строки, которые попадают в радиус от определенной точки (на самом деле я получаю квадрат для скорости), но мне нужны только поля, которые уже проиндексированы, так что этот индекс фактически покрывает, а план выполнения состоит всего из 2 шагов:

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

Теперь я пытаюсь воспользоваться преимуществами пространственных возможностей SQL 2008.Я создал столбец География, заполнил его, создал пространственный индекс, работы.

И все это работает нормально, за исключением того, что план выполнения состоит из миллиона шагов, и 74% времени тратится на поиск по кластеризованному индексу, где он соединяет строки, найденные в пространственном индексе, с фактической таблицей, чтобы получить остальные данные...
(Поиск по пространственному индексу занимает 1% от стоимости Плана выполнения)

Итак, по-видимому, он использует пространственный индекс надлежащим образом и находит нужные мне записи намного быстрее, чем раньше с моим "обычным" индексом по широте / длине, но присоединение к основной таблице меня УБИВАЕТ, пространственный запрос занимает в 7 раз больше времени, чем мой старый.

Есть ли какой-нибудь способ добавить больше столбцов в пространственный индекс, чтобы он охватывал все и мог выполнять действия за один шаг, точно так же, как это делалось раньше?
Есть ли другие вещи, которые я мог бы сделать, чтобы улучшить эту ситуацию?


Обновить:Я обнаружил, что "обычные" индексы могут "включать" другие столбцы, используя ключевое слово INCLUDE (о котором я не знал, раньше я просто включал столбцы в сам индекс)
Согласно документации здесь, это предложение не является опцией для пространственных индексов...Есть какие-нибудь идеи?

Спасибо!
Дэниел

Это было полезно?

Решение

Нет, к сожалению, в настоящее время нет способа создать охватывающий пространственный индекс - запрос всегда будет выполнять поиск по закладкам в базовой таблице, чтобы получить значение географии для строки.

Для STIntersects это явно требуется всегда, поскольку нам все еще нужно выполнить дополнительный фильтр для фактического объекта geography, чтобы убедиться, что он действительно пересекается с объектом parameter .Однако, если вам не требуются точные ответы и вы можете использовать Filter(), тогда можно было бы предоставить столбцы первичного ключа из индекса вообще без выполнения поиска в базовой таблице.Поддержка этого - это то, что мы рассматриваем для следующего выпуска.

Что касается ускорения вашего текущего запроса, вы пробовали использовать Filter() и настраивать свой индекс с помощью выходных данных sp_help_geography_index?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top