Привет.
Беда приключилась - я столкнулся с MS SQL Server R2 2008, который до этого ни разу не видел в глаза.
У меня есть база:
автор |
---|
Track
Segment_ID(character), Track (geometry)
Segment_ID
Segment_ID(character), Road_ID(character)
Road
Road_ID(character), Name(character) |
И задача такая. Есть дороги, которые хранятся в таблице Road. Дороги состоят из сегментов, которые хранятся в таблице Track. Эти две таблицы соединены посредством таблицы Segment_ID. Дак вот я хочу собрать сегменты одно дороги в единое целое. Я имею в виду, что хочу соеденить геометрии всех сегментов дороги (поле Track.Track) в единую дорогу.
То есть на вывод я хочу получить:
Road.Name
Road.Road_ID
Road (geometry)
Для соединения геомтрии нашел замечательную функцию geom1.STUnion(geom2).
Нашел один из способов сделать это:
автор |
---|
with by_segment as ( SELECT Road.Road_ID, GEOMETRY::STGeomFromText(Track.Track.STAsText(),4326) as the_geom, row_number() over (partition by road_id order by Segment_Id) as [rn], count(*) over (partition by road_id) as [c] FROM dbo.Road LEFT JOIN Segment_ID ON Road.Road_ID = Segment_ID.Road_ID LEFT JOIN Track ON Segment_ID.Segment_ID = Track.Segment_ID ), roads_by_segment as ( select road_id, the_geom, [rn], [c] from by_segment where [rn] = 1
union all
select [a].road_id, [a].the_geom.STUnion([b].the_geom), [b].[rn], [b].[c] from by_segment as [a] inner join roads_by_segment as [b] on [a].segment_id = b.[segment_id] and [a].[rn] = [b].[rn]+1 )
select * from roads_by_segment |
Это вроде как делает то что я хочу. Но работает чертовски медленно. Допустим у меня есть 76 дорог и за первые 5секунд выполнения запроса я получаю 75 дорог и еще через пять минут 76-тую дорогу. Скорость меня очень не устраиват. Прикрепляю к вопросу план выполнения, правда не знаю насколько он информативен.
И я хочу спросить это вообще верный путь делать такой запрос или есть более оптимальный вариант? Буду блпгодарен за совет да помощь.