如何加速SQL查询

时间:2013-02-22 10:08:30

标签: sql sql-server

我是MS SQL-Server的新手。但是已经有问题了。
我有一个问题:

   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) 它可以从这个怪物查询中获取功能吗?并且使用函数可以使这个查询更快?

更新

我想创建视图以在Geoserver上发布它。但我有几何问题。我有几行线段。

我想我会谈论表结构。我有3张桌子:

轨道

Segment_ID(character),
Track (geometry)

SEGMENT_ID

Segment_ID(character),
Road_ID(character)

Road_ID(character),
Road_Name(character)

在查询结果中,我想获得Road.Name,Road.Road_ID以及此道路的单一功能中连接的所有段。

更新

我看到一些有趣的东西。在表道我有76行。当我按下执行查询时,我得到75行,5分钟后,我得到所有76行。最后一次迭代的问题。什么可能是错的?

更新

执行计划http://sd.reborn.ru/download.php?fid=f52cb6c6146fdb993c1375f8b1da4787

1 个答案:

答案 0 :(得分:0)

可以从这个怪物查询中创建函数吗?

--> Yes

使用函数可以加快查询速度吗?

--> No

很抱歉这个简短的回答。但是,如果没有任何有关数据模型业务规则的背景信息或有关计划的技术细节,则无法提供详细的改进建议。