2010-03-22 114 views
2

我有一张满载经销商的表格以及他们的经度和纬度。我正在努力确定最接近的n个经销商,以确定任何给定的纬度和经度。我已经有了计算位置之间距离的功能,但我想尽可能少地进行计算(我的表格可以包含数千个条目)。目前我必须计算每个条目的距离,然后对它们进行排序。在进行计算以提高性能之前,是否有任何方法进行排序?SQL 2003距离纬度经度

This问题很好,但是我并不总是知道我的范围。我应该选择一个任意高的范围,然后改进我的结果?我很感谢社区提供的任何帮助。

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

回答

1

而是对所有记录执行你的计算,你可以用你的拉/长号码的简单毕达哥拉斯计算和选择前20名。然后,您可以使用更准确的功能选择实际的前10名。虽然这是不准确的,但它应该足够准确以减少数据集。

编辑:事情是这样的

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53 

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
WHERE 
    MemberId IN 
(
    SELECT TOP 20 
     MemberID 
    FROM 
     Dealers 
    ORDER BY 
     SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon)) 
) 
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

不过,我建议你与你的数据集都试一下,并简介它,看看实际表现的差异可能是什么。

+0

谢谢。这确实可以提高性能(随着记录数量的增加,性能会提高)。如果我不需要实际的距离,是否有遗漏内部查询的错误,并使用'SQRT(SQUARE(@Lat - Lat)+ SQUARE(@Lon - Lon))' – 2010-03-23 00:28:26

+1

距离等于30英里或更小毕达哥拉斯精确到几百英尺。使用Haversine功能可获得更远的距离。 – 2010-03-23 01:29:34

1

我想你真的很喜欢地理空间索引。否则,随着行数增加非常大,您将不得不访问每一行来执行毕达哥拉斯计算。

它看起来像SQL Server支持空间数据类型,SQL Server 2008甚至吹嘘为“new spatial indexes for high performance queries”。您可以使用SQL Server空间数据类型,然后对空间索引执行邻近查询吗?

相关问题