0

Запуск SQL Server 2014 StandardНахождение округа на дороге с помощью STContains

У меня есть около 1 млн LineString (представляют собой дороги) и 98 полигонов (графства). Я хочу обновить то, в каком графстве принадлежит дорога. Мой запрос:

UPDATE RAW_HERE 
SET COUNTY = RAW_HERE_COUNTY.POLYGON_NM 
FROM [dbo].[RAW_HERE_PROCESSED_SINGLE] AS RAW_HERE 
INNER JOIN [RAW_HERE_D91_COUNTY] as RAW_HERE_COUNTY ON (RAW_HERE_COUNTY.[Shape].STContains(RAW_HERE.[Shape]) = 1) 

Этот запрос был запущен в течение 3 часов и подсчета голосов, и я проверить его с помощью пространственного индекса на RAW_HERE_D91_COUNTY

RAW_HERE_PROCESSED_SINGLE содержит объект LineString (их столбец геометрии [форму]) RAW_HERE_D91_COUNTY содержит граф многоугольников, их геометрический столбец также [shape].

Есть ли более быстрый способ сделать это? Я что-то упускаю?

+0

Вы уверены, что хотите использовать 'STContains()', а не 'STIntersects()'? Первый проверяет, находится ли (в вашем случае) дорога полностью в пределах округа, в то время как последняя проверяет, находится ли какая-либо часть дороги в округе. Много дорог, которые я знаю, охватывают более одного округа, поэтому я думаю, что наличие дороги только для одного округа кажется мне странной моделью данных. Кроме того, я вижу, что сервер должен больше работать для 'STContains()' над 'STIntersects()', но это всего лишь ощущение кишки. –

+0

Если дорога пересекается с двумя уездами, то в каком графстве она попадет? Мой план состоял в том, чтобы сначала заполнить тех, кто был полностью сложен, а затем разобраться с краевыми случаями, если они охватывают несколько. – LearningJrDev

+0

Точно моя точка. В любом случае, думая об этом больше, мне было интересно, действительно ли это обновление, которое занимает так много времени. Но похоже, что вы пришли к такому же выводу с вашим самопомощи. –

ответ

0

Это займет всего 5 минут, чтобы сделать первичный ключ графства кода поиска, поэтому вступление в графстве, а не присоединение округа по дорогам кажется путь

CREATE TABLE [dbo].[#OBJECTCOUNTY](
    OBJECTID int PRIMARY KEY, 
    [County] [nvarchar](105) NOT NULL 
) ON [PRIMARY] 

INSERT INTO [#OBJECTCOUNTY] 
SELECT RAW_HERE.OBJECTID, RAW_HERE_COUNTY.POLYGON_NM as County 
FROM [RAW_HERE_D93_COUNTY] as RAW_HERE_COUNTY 
LEFT JOIN [RAW_HERE_D93] as RAW_HERE ON (RAW_HERE_COUNTY.[Shape].STContains(RAW_HERE.[Shape]) = 1) 
WHERE RAW_HERE.[Shape] IS NOT NULL 

Тогда просто обновить на основе таблицы.

 Смежные вопросы

  • Нет связанных вопросов^_^