У меня есть таблица, содержащая ПОЛИГОНЫ/МУЛЬТИПОЛИГОНЫ, представляющие территории клиентов:
Вот упрощенный запрос, который воспроизведет проблему, с которой я сталкиваюсь:
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))
не имеет никакого эффекта, и из плана выполнения ясно, что он ссылается на мой индекс независимо от подсказки.
Казалось возможным, что полигоны территорий, импортированные из данных переписи населения США, излишне сложны, поэтому я создал второй столбец и протестировал уменьшенные полигоны (с методом Reduce()) с разной степенью толерантности.Выполнение того же запроса, что и выше, для нового столбца дало следующие результаты:
Явно движется в правильном направлении, но снижение точности кажется неэлегантным решением. Разве не для этого должны быть индексы? И план выполнения по-прежнему кажется странно сложным для такого простого запроса.
Из любопытства я удалил пространственный индекс и был ошеломлен результатами: