Сначала проверьте ваши пространственные индексы. Вы можете создать их, используя оператор SQL, такой как
CREATE SPATIAL INDEX MyIndexName ON MyTable(GeomFieldName) USING GEOMETRY_GRID
WITH (
BOUNDING_BOX =(-1493907.5664457313, 6128509.51667404, -578861.3521250226, 7703103.135644257),
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Ключевым параметром для изменения является BOUNDING_BOX. Это должно быть установлено в ограничивающую рамку ваших данных, или максимальную ограничивающую рамку ожидаемых данных. Поэтому, если ваши данные ограничены Северной Америкой, установите ограничивающий прямоугольник в пределах Северной Америки, а не мира.
Вы можете добавить вычисляемые поля, чтобы показать границу каждого объекта, как указано в http://geographika.co.uk/sql-server-spatial-sql - и затем можете использовать стандартный запрос для просмотра максимальных экстентов.
Также проверьте использование профилировщика, чтобы увидеть, что индексы действительно используются. Иногда вам нужно принудительно использовать их с помощью оператора WITH (INDEX (MyIndexName)).
SELECT *
FROM MyTable
WITH (INDEX (MyIndexName))
WHERE (geometry::Point(@x,@y,3785).STWithin(MyGeomField) = 1)
Я также обнаружил, что иногда при выполнении запросов по точкам не используется пространственный индекс, поэтому стоит экспериментировать.
Альтернатива
Последним вариантом будет создание триггера при добавлении новой записи, который назначит ей идентификатор многоугольника при ее создании или обновлении. Это позволило бы почти мгновенные запросы к вашим данным.
И наконец
В последней версии Denali SQL Server пространственные индексы могут создаваться с помощью автоматической опции, а не вручную. По-видимому, также было повышение производительности для STWithin и STIntersects.