我有一个SQL表: SuburbId int, SubrubName varchar, StateName varchar, 邮政编码varchar, 纬度十进制, 经度十进制
在MY C#中,我创建了一个创建边界框的代码,以便我可以按距离搜索。 我获取子灌木的存储过程是:
[dbo].[Lookup] (
@MinLat decimal(18,15),
@MaxLat decimal(18,15),
@MinLon decimal(18,15),
@MaxLon decimal(18,15)
)
AS
BEGIN
SELECT SuburbId, suburbName, StateName, Latitude, Longitude
FROM SuburbLookup
WHERE (Latitude >= @MinLat AND Latitude <= @MaxLat AND Longitude >= @MinLon AND Longitude <= @MaxLon)
END
我的问题是..这是一个聚集索引扫描...有没有更有效的方法来做到这一点?
答案 0 :(得分:0)
对于标准B树索引,这种类型的查询往往表现不佳。为了获得更好的性能,您可以使用geography
列类型并添加spatial index。
WHERE geography.STDistance(geography2) < number
can use a spatial index等查询。
答案 1 :(得分:0)
应该有所帮助的几个链接。当然,根据您项目的范围,您可能已经拥有最佳解决方案。
如果您愿意,可以在sql server中为您的位置创建自定义索引。
此外,如果您愿意,您可以查看Quadtrees和Quadtiles。有一种技术可以通过交错地址计算密钥,这些地址是lat和lon对的组合,可以表示为整数,然后截断到基本级别,以查看它们与彼此之间的关系。