Пространственный индекс, замедляющий запрос

Задний план

У меня есть таблица, содержащая ПОЛИГОНЫ / МУЛЬТИПОЛИГОНЫ, которые представляют территории клиентов:

  • Таблица содержит примерно 8000 строк.
  • Примерно 90% многоугольников представляют собой круги.
  • Остальные многоугольники представляют один или несколько штатов, провинций или других географических регионов. Необработанные данные многоугольника для этих фигур были импортированы из данные переписи населения США.
  • Таблица имеет пространственный индекс и кластерный индекс по первичному ключу. В настройки SQL Server 2008 R2 по умолчанию не было внесено никаких изменений. 16 ячеек на объект, все уровни средние.

Вот упрощенный запрос, который воспроизводит проблему, с которой я столкнулся:

DECLARE @point GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT (-76.992188 39.639538)', 4326)

SELECT terr_offc_id
FROM tbl_office_territories
WHERE terr_territory.STIntersects(@point) = 1

То, что кажется простым и понятным запросом, занимает 12 или 13 секунд для выполнения и имеет очень сложный план выполнения для такого простого запроса.

План выполнения

В моем исследовании несколько источников предлагали добавить к запросу подсказку индекса, чтобы гарантировать, что оптимизатор запросов правильно использует пространственный индекс. Добавление WITH(INDEX(idx_terr_territory)) не имеет никакого эффекта, и из плана выполнения ясно, что он ссылается на мой индекс независимо от подсказки.

Уменьшение полигонов

Казалось возможным, что полигоны территорий, импортированные из данных переписи населения США, излишне сложны, поэтому я создал второй столбец и протестировал уменьшенные полигоны (w / метод Reduce ()) с различной степенью допуска. Выполнение того же запроса, что и выше, к новому столбцу, дало следующие результаты:

  • Без уменьшения: 12649 мс
  • Уменьшено на 10. 7194 мс
  • Уменьшено на 20: 6077 мс
  • Уменьшено на 30: 4793 мс
  • Уменьшено на 40: 4397 мс
  • Уменьшено на 50: 4290 мс

Ясно движется в правильном направлении, но снижение точности кажется неэлегантным решением. Разве не для этого должны быть индексы? И план выполнения для такого базового запроса по-прежнему кажется невероятно сложным.

Пространственный индекс

Из любопытства я удалил пространственный индекс и был ошеломлен результатами:

  1. Запросы выполнялись быстрее БЕЗ индекса (менее 3 секунд без уменьшения, менее 1 секунды с допуском на уменьшение> = 30)
  2. План выполнения выглядел намного проще:

План выполнения без индекса

Мои вопросы

  1. Почему мой пространственный индекс замедляет работу?
  2. Действительно ли необходимо уменьшить сложность многоугольника, чтобы ускорить мой запрос? Снижение точности может вызвать проблемы в будущем, и не похоже, что оно будет хорошо масштабироваться.

Прочие примечания


person David Budiac    schedule 14.03.2012    source источник


Ответы (2)


Моя первая мысль - проверить ограничивающие координаты индекса; посмотрите, покрывают ли они всю вашу геометрию. Во-вторых, пространственные индексы, оставленные по умолчанию 16MMMM, по моему опыту, работают очень плохо. Я не уверен, почему это значение по умолчанию. Я написал кое-что о настройке пространственного индекса в этом ответе.

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

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

Да, и поскольку прошло два года, начиная с SQL Server 2012, теперь существует GEOMETRY_AUTO_GRID тесселяция, которая выполняет настройку индекса за вас и большую часть времени отлично справляется со своей задачей.

person Geobility    schedule 26.06.2014
comment
Спасибо @GreenGeo. Прошло некоторое время с тех пор, как я работал с этой проблемой. В конце концов, мы сдались и решили, что это будет что-то, что будет исправлено в 2012 году. Но ваш ответ помогает. Вероятно, мы скоро снова попробуем использовать геопространственные вещи. - person David Budiac; 27.06.2014

Это может быть связано с тем, что более простой план выполнения выполняется параллельно, тогда как другой - нет. Однако есть предупреждение о первом плане выполнения, которое, возможно, стоит изучить.

person Sebastian Meine    schedule 13.01.2013