2013-02-22 3 views
1

Im new с MS SQL-Server. Но у него уже есть проблема.
У меня есть запрос:Как ускорить SQL-запрос

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 where [rn] = [c] 

своих работ, но и ее тека много времени. Я имею в виду, когда я нажимаю выполнить запрос, я получаю результат в течение 2 секунд, но запрос все еще работает около 5 минут.
Я думаю, что его слишком много выбирает здесь. Там выбирается необходимость в функции geometry1.STUnion(geometry2).
Возможно ли выполнить функцию из этого запроса на монстр? И использование функции может сделать этот запрос быстрее?

UPDATE

Я хочу создать представление, чтобы опубликовать его на Geoserver. Но у меня проблема с геометрией. У меня есть геометрия сегментов линии.

Думаю, я собираюсь рассказать о структуре таблиц. У меня есть 3 таблицы:

Трек

Segment_ID(character), 
Track (geometry) 

Segment_ID

Segment_ID(character), 
Road_ID(character) 

роуд

Road_ID(character), 
Road_Name(character) 

И в результате запроса я eant получить Road.Name, Road.Road_ID и все сегмент, соединенный в единую функцию для этой дороги.

UPDATE

я вижу что-то интересное. В Столовой дороге у меня 76 рядов. Когда я нажимаю выполнить запрос, я получаю 75 строк, и через 5 минут я получаю все 76 строк. Итак, проблема в последней итерации. Что может быть неправильным?

UPDATE

План выполнения http://sd.reborn.ru/download.php?fid=f52cb6c6146fdb993c1375f8b1da4787

+2

Хорошо. Этот сайт не является сайтом «сделай мою работу для меня». В частности, вы взяли запрос, который я написал для вас здесь (http://stackoverflow.com/questions/14943346/how-to-connect-lines-in-single-feature-in-sql-server/14949585), представили его как свое, и теперь просят людей настроить это. Что вы пробовали? Только у вас есть доступ к вашим фактическим данным, поэтому любые усилия, прилагаемые здесь, будут в основном спекулятивными. Вы посмотрели план запроса? Что это говорит? Скажите нам, что вы пробовали, а что нет, и мы можем вам помочь. –

ответ

0

Ее можно сделать функцию из этого запроса монстра?

--> Yes 

И использование функции может сделать этот запрос быстрее?

--> No 

Извините за этот короткий ответ. Но без каких-либо данных backgroud о бизнес-правилах вашей модели данных или технических подробностей о плане невозможно дать подробные рекомендации по улучшению.

+0

Но что я могу сделать, чтобы ускорить запрос>? –

+0

Извините за плохой вопрос. Я попробую обновить его в течение 2 минут.Вы можете посмотреть на это? –

+1

Проверьте индексы на столбце 'road_id'? Если этого не существует, попробуйте создать один некластерный (я полагаю, что у вас уже есть кластерный индекс в этой таблице). Попробуйте загрузить план выполнения, который наглядно показывает, что делает SQL Server при выполнении запроса? Любая дополнительная информация будет отличной. – veljasije

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