Фон
У меня есть таблица, содержащая полигоны / мультиполигоны, которые представляют территории клиентов:
- Таблица содержит примерно 8 000 строк
- Приблизительно 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мс
Четко направлено в правильном направлении, ноОтбрасывание точности кажется не элегантным решением.Разве это не то, для чего должны быть индексы?И план выполнения все еще кажется странно сложным для такого базового запроса.
Пространственный индекс
Из любопытства я удалил пространственный индекс и был ошеломлен результатами:
- Запросы выполнялись быстрее БЕЗ индекса (менее 3 секунд без сокращения, менее 1 секунды с допуском сокращения> = 30)
- План выполнения выглядел намного, гораздо проще:
Мои вопросы
- Почему мой пространственный индекс замедляет процесс?
- Действительно ли необходимо уменьшить сложность моего многоугольника для ускорениямой запрос?Точность отбрасывания может вызвать проблемы в будущем, и не похоже, что она будет очень хорошо масштабироваться.
Другие примечания