SQL Slow Spatial Data - PullRequest
       0

SQL Slow Spatial Data

3 голосов
/ 22 октября 2010

У меня есть две таблицы, одна из которых называется Point, а другая - Poly. У меня около 400 полигонов в таблице Poly и около 200 тысяч точек в таблице Point.я хотел узнать, сколько точек в определенном многоугольнике.Я использую запрос:

select COUNT(*) from point p
inner join Poly pl  on pl.GeoDataID = 101 and p.geopoint.STIntersects(pl.Poly)=1 

Я также создал пространственные индексы для столбцов GeoPoint и Poly, и оба столбца имеют тип географии.

Редактировать: Использование SQL Server 2008

Вопрос. Вышеупомянутый запрос возвращает результаты в течение от 1 минуты до 40 секунд, что слишком медленно для моего случая, потому что я хотел показать их на Google Картах в реальном времени,Правильный ли мой подход к этой проблеме?или есть ли лучший способ добиться этого?

1 Ответ

2 голосов
/ 23 октября 2010

Сначала проверьте ваши пространственные индексы. Вы можете создать их, используя оператор 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.

...